题目:给定一个树,判断另一个树是否是该树的子树,要求:约定空树不是任意一个树的子结构。
思路:依次遍历给定的树的每个节点(A),比较被求的节点(B)是否是该节点(A)以下的部分的子结构。如果是,直接返回true,如果不是,则再次将A节点的左节点和节点B比较,将A节点的右节点和B节点进行比较,取两者的并集。而比较每个节点(A)是否是节点(B)的父结构的方法是比较每个节点的值是否相等,如果相等,则再比较各自的子节点。当然要注意边界条件,例如当B节点的子节点都为空的时候,依然是能够满足条件的。
源码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2)
{
if(root1==null||root2==null)
return false;
if(compare(root1, root2))
return true;
else
{
return compare(root1.left, root2)||compare(root1.right, root2);
}
}
public boolean compare(TreeNode node1,TreeNode node2)
{
if(node1==null&&node2!=null)
return false;
if(node2==null)
return true;
if(node1.val!=node2.val)
return false;
return compare(node1.left, node2.left)&&compare(node1.right, node2.right);
}
}