using
System;
using
System.Collections.Generic;
public
class
Node {
public
int
data;
public
Node left, right;
public
Node(
int
data)
{
this
.data = data;
left =
null
;
right =
null
;
}
}
public
class
GFG {
public
static
Node newNode(
int
data)
{
Node temp =
new
Node(data);
return
temp;
}
public
static
int
height_of_tree(Node root)
{
if
(root ==
null
)
return
0;
int
left = height_of_tree(root.left);
int
right = height_of_tree(root.right);
return
1 + Math.Max(left, right);
}
public
static
bool
CheckSubTree(Node T, Node S)
{
if
(S ==
null
&& T ==
null
)
return
true
;
if
(T ==
null
|| S ==
null
)
return
false
;
if
(T.data != S.data)
return
false
;
return
CheckSubTree(T.left, S.left)
&& CheckSubTree(T.right, S.right);
}
public
static
int
subtree_height(Node root, List<Node> nodes,
int
h)
{
if
(root ==
null
)
return
0;
else
{
int
left = subtree_height(root.left, nodes, h);
int
right
= subtree_height(root.right, nodes, h);
int
height = Math.Max(left, right) + 1;
if
(height == h)
nodes.Add(root);
return
height;
}
}
public
static
bool
isSubTree(Node T, Node S)
{
if
(T ==
null
&& S ==
null
)
return
true
;
if
(T ==
null
|| S ==
null
)
return
false
;
int
h = height_of_tree(S);
List<Node> nodes =
new
List<Node>();
int
h1 = subtree_height(T, nodes, h);
bool
result =
false
;
int
n = nodes.Count;
for
(
int
i = 0; i < n; i++) {
if
(nodes[i].data == S.data)
result = CheckSubTree(nodes[i], S);
if
(result)
return
true
;
}
return
false
;
}
public
static
void
Main()
{
Node T = newNode(1);
T.left = newNode(2);
T.right = newNode(3);
T.left.left = newNode(4);
T.left.right = newNode(5);
T.right.left = newNode(6);
Node S = newNode(3);
S.left = newNode(6);
if
(isSubTree(T, S))
Console.WriteLine(
"Yes"
);
else
Console.WriteLine(
"No"
);
}
}