using
System;
using
System.Collections.Generic;
class
GFG{
class
Node {
public
int
data;
public
Node left;
public
Node right;
};
static
Node newNode(
int
x)
{
Node temp =
new
Node();
temp.data = x;
temp.left =
null
;
temp.right =
null
;
return
temp;
}
static
bool
areTreeIdentical(Node t1, Node t2)
{
Stack<Node> s1 =
new
Stack<Node>();
Stack<Node> s2 =
new
Stack<Node>();
Node temp1;
Node temp2;
s1.Push(t1);
s2.Push(t2);
while
(s1.Count != 0 && s2.Count != 0) {
temp1 = s1.Peek();
temp2 = s2.Peek();
s1.Pop();
s2.Pop();
if
(temp1 ==
null
&&
temp2 ==
null
)
continue
;
if
((temp1 ==
null
&& temp2 !=
null
) ||
(temp1 !=
null
&& temp2 ==
null
))
return
false
;
if
(temp1.data != temp2.data)
return
false
;
s1.Push(temp1.right);
s2.Push(temp2.right);
s1.Push(temp1.left);
s2.Push(temp2.left);
}
if
(s1.Count == 0 && s2.Count == 0)
return
true
;
else
return
false
;
}
static
bool
isSubTree(Node s, Node t)
{
Stack<Node> stk =
new
Stack<Node>();
Node temp;
stk.Push(t);
while
(stk.Count != 0) {
temp = stk.Peek();
stk.Pop();
if
(temp.data == s.data) {
if
(areTreeIdentical(s, temp))
return
true
;
}
if
(temp.right !=
null
)
stk.Push(temp.right);
if
(temp.left !=
null
)
stk.Push(temp.left);
}
return
false
;
}
public
static
void
Main(String[] args)
{
Node root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.left = newNode(4);
root.left.right = newNode(5);
root.right.left = newNode(6);
root.right.right = newNode(7);
Node root2 = newNode(2);
root2.left = newNode(4);
root2.right = newNode(5);
if
(isSubTree(root2, root))
Console.Write(
"Yes"
);
else
Console.Write(
"No"
);
}
}