【剑指offer】26.树的子结构

26.树的子结构

面试题26. 树的子结构

难度中等37

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:

给定的树 A:

3 / \ 4 5 / \ 1 2

给定的树 B:

4 / 1

返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

思路:

//1.若A的根节点和B的根节点相同,则递归调用

// a.终止条件 b == null 说明b遍历完毕 返回true

// b.a == null a.val != b.val 说明a树遍历结束没有找到b的开始根节点

// c.递归调用a的左节点和b的左节点 或者a的右节点 和 b的右节点

//2.调用A的做节点和B子树比较 重复上述步骤

//3.A的右节点和B子树比较 重复1

时间复杂度:O(MN)

空间复杂度:O(M)

//1.若A的根节点和B的根节点相同,则递归调用 
    //  a.终止条件 b == null 说明b遍历完毕 返回true
    //  b.a == null a.val != b.val 说明a树遍历结束没有找到b的开始根节点
    //  c.递归调用a的左节点和b的左节点 或者a的右节点 和 b的右节点
    //2.调用A的做节点和B子树比较  重复上述步骤
    //3.A的右节点和B子树比较  重复1
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        return (A != null && B != null ) && (recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B));
    }

    private boolean recur(TreeNode a,TreeNode b){
        if(b == null) return true;
        if(a == null || a.val != b.val) return false;
        return recur(a.left,b.left) && recur(a.right,b.right);
    }
posted @ 2020-04-06 21:23  qxlxi  阅读(63)  评论(0编辑  收藏  举报