noaman_wgs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
//输入两棵二叉树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
//
//
// 示例 2:
//
// 输入:A = [3,4,5,1,2], B = [4,1]
//输出:true
//
// 限制:
//
// 0 <= 节点个数 <= 10000
// Related Topics 树
// 👍 220 👎 0



class Solution {

    private boolean isSubStructure = false;
    public boolean isSubStructure(TreeNode rootA, TreeNode rootB) {
        if (rootA == null || rootB == null) {
            return false;
        }

        dfsTree(rootA, rootB);
        return isSubStructure;
    }

    public void dfsTree(TreeNode rootA, TreeNode rootB) {
        // 在左对比树搜索,如果到了叶子节点,就返回
        if (rootA == null) {
            return;
        }

        // 两者节点相同时,就进一步比较左右字节点。
        // 比较完在当前层就会结束
        if (rootA.val == rootB.val) {
            if (dfsTreeHelper(rootA, rootB)) {
                isSubStructure = true;
                return;
            }

        }
        // 继续在A树中寻找和对比
        dfsTree(rootA.left, rootB);
        dfsTree(rootA.right, rootB);
    }

    private boolean dfsTreeHelper(TreeNode rootA, TreeNode rootB) {
        //  左树结束,但是右树未结束,返回false
        // 如 3-1, 3-1-2, 3.right = null,但是3.right =2
        if (rootA == null && rootB != null) {
            return false;
        }
        //右树搜完了
        if (rootB == null) {
            return true;
        }
        if (rootA.val != rootB.val) {
            return false;
        }

        return dfsTreeHelper(rootA.left, rootB.left)
                && dfsTreeHelper(rootA.right, rootB.right);


    }
}

 

posted on 2021-03-15 16:08  noaman_wgs  阅读(47)  评论(0编辑  收藏  举报