题解 | #树的子结构#

树的子结构

http://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

描述

输入两棵二叉树A,B,判断B是不是A的子结构。(我们约定空树不是任意一个树的子结构) 假如给定A为{8,8,7,9,2,#,#,#,#,4,7},B为{8,9,2},2个树的结构如下,可以看出B是A的子结构

思路:递归

递归遍历大树的每个节点,和小树进行比较。时间复杂度O(MN)。M为A的节点数,N为B的节点数

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null) {
            return false;
        }
        boolean r1 = isEqual(root1, root2);
        boolean r2 = HasSubtree(root1.left, root2);
        boolean r3 = HasSubtree(root1.right, root2);
        return r1 || r2 || r3;
    }
    
    boolean isEqual(TreeNode root1, TreeNode root2) {
        // 小树遍历完成,说明全部节点匹配
        if(root2 == null) {
            return true;
        }
        if(root1 == null || root1.val != root2.val) {
            return false;
        }
        // 递归比较左右节点
        return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
    }
}

思路2:借助队列

使用队列对大树进行层序遍历

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null) {
            return false;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root1);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if(isEqual(node, root2)) {
                return true;
            }
            if(node.left != null) {
                queue.offer(node.left);
            }
            if(node.right != null) {
                queue.offer(node.right);
            }
        }
        return false;
    }
    
    boolean isEqual(TreeNode root1, TreeNode root2) {
        if(root2 == null) {
            return true;
        }
        if(root1 == null || root1.val != root2.val) {
            return false;
        }
        return isEqual(root1.left, root2.left) && isEqual(root1.right, root2.right);
    }
}
全部评论

相关推荐

08-15 01:16
Python
Java小萌新新萌小...:照片不用整这么大的 而且你的照片截歪了 你想找专业对口的 那普通话证写在这里其实没有什么必要 就是看着内容多点 而且里面字体大小也不一样 修改一下排版 有很多空间可以再利用一下 字大一点 不然现在这样观感不太好 再就是项目好好优化一下 加油
点赞 评论 收藏
分享
山暮雨:哈哈哈校友,项目太简单了,可以做一个buckboost,然后你说你自己做的是硬件,那画了几层板,侧重点是用了什么电路什么拓扑结构,你这个没有凸显出来
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务