题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

题解

树的遍历有递归和迭代

递归比较容易写,就递归吧

先在A树中递归查找B树的根节点

找到后,再递归判断两颗树的左右孩子是否相等,都相等则B是A的子结构

不等,继续在A中找下一个B的根节点

/*判断root2是否是root1的子树*/
public boolean HasSubtree(TreeNode root1, TreeNode root2) {
    if (root1 == null || root2 == null)
        return false;

    boolean res = false;

    /*
    在Tree1中找Tree2的根节点
    */

    //找到了,就去判断它们的左右孩子是否相等
    if (root1.val == root2.val)
        res = HasNode(root1,root2);

    if (!res)
        res = HasSubtree(root1.left,root2);
    if (!res)
        res = HasSubtree(root1.right,root2);


    return res;
}

/*判断左右字节点是否都相等*/
public boolean HasNode(TreeNode root1, TreeNode root2){

    //如果Tree2已经遍历完了都能对应的上,返回true
    if (root2 == null)
        return true;

    //Tree1遍历完了,Tree2却没遍历完,返回false
    if (root1 == null)
        return false;

    //Tree1和Tree2子节点不等,返回false
    if (root1.val != root2.val)
        return false;

    //以上条件都满足,递归向下去匹配左右孩子
    return HasNode(root1.left,root2.left) && HasNode(root1.right,root2.right);
}