题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:我们很容易想到先遍历二叉树,找到和B树根节点相等的节点,进行比较。
那么我们怎么做呢?
我写了两个方法来解决这个问题分别是 public boolean HasSubtree(TreeNode root1,TreeNode root2)遍历二叉树
和 public boolean doseTree1HaveTree2(TreeNode root1,TreeNode root2)判断是否为子结构。
1.遍历二叉树
我选择的是用递归方法前序遍历
1)首先判断A和B是否为null如果为null则直接返回false
2)如果都不为null,递归遍历A节点,看是否和B的根节点相等。
- 比较A的当前节点,和B的当前节点是否相等
- 如果相等判断是否为子结构(执行doseTree1HaveTree2(root1,root2)),
- 如果不等,判断当前A的左节点是否相等,(递归调用该方法HasSubtree(root1.left, root2.left),)
- 如果也不等,判断当前A的右节点是否相等,(递归调用该方法HasSubtree(root1.right, root2.right))
2.判断是否为子结构
当我们找到相等节点后需要做以下几件事
1).先判断B是否为null,如果为null返回true,说明B是A的子结构,
2).如果不为null,判断A是否为null,如果为null返回false,因为B还没比较完A就结束了,说明B不是A的子结构。
3).如果A和B都不为null,判断当前A节点是否和当前B节点相等,如果相等,循环1-3步,判断当前A节点的左右子树和当前B节点左右子树是否都相等。
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean b = false;
if(root1!=null&&root2!=null)
{
if(root1.val==root2.val)
{
b = doseTree1HaveTree2(root1,root2);
}
if(!b)
{
b = HasSubtree(root1.left,root2) ;
}
if(!b)
{
b = HasSubtree(root1.right,root2) ;
}
}
return b;
}
public boolean doseTree1HaveTree2(TreeNode root1,TreeNode root2)
{
boolean b=false;
if(root2==null)
{
return true;
}
if(root1==null)
{
return false;
}
if(root1.val!=root2.val)
{ return false;
}
return
doseTree1HaveTree2(root1.left,root2.left)&&doseTree1HaveTree2(root1.right,root2.right);
}