二叉树(十三)-- 另一棵树的子树

Posted 算法和数据结构

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树(十三)-- 另一棵树的子树相关的知识,希望对你有一定的参考价值。

来源:LeetCode

难度:中等

描述:

        给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。


示例1:


示例2:

二叉树(十三)-- 另一棵树的子树


分析:

        这题和有点类似,在判断两个树相等的时候的代码可以复用。不同的地方由于本题的root树节点值可能重复的,并且子树subRoot只是root的一部分,所以在包含subRoot的同时还会多出一些节点。

        因此咱们在判断的时候需要遍历每个节点去判断以当前节点为根节点的root树是否和subRoot完全一致,以下是具体解法步骤。


解题


方法一:递

思路:如分析,采用递归的方式遍历每个节点,判断以当前节点为 root 的子树,是否和 subRoot 树相同。具体步骤:

  • 根节点开始,判断整个树是否和 subRoot相同,不相同则递归左右子树,是否和 subRoot相同

  • 当遍历到 null 节点,始终没有返回true,则返回false


代码:

 1public boolean isSubtree(TreeNode root, TreeNode subRoot) {
2    if (subRoot == null) {
3        return true;
4    }
5    if (root == null) {
6        return false;
7    }
8    //判断以当前节点为root的子树,是否和subRoot完全一致
9    if (isSameTree(root, subRoot)) {
10        return true;
11    }
12
13    //递归左右子树
14    return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
15}
16
17public boolean isSameTree(TreeNode p, TreeNode q) {
18    //都为空
19    if (p == null && q == null) {
20        return true;
21    }
22    //一方为空
23    if (p == null || q == null) {
24        return false;
25    }
26    //根节点不同
27    if (p.val != q.val) {
28        return false;
29    }
30    //根节点相同,递归判断左右子树
31    return isSameTree(p.left, q.left) & isSameTree(p.right, q.right);
32}

时间复杂度:--

空间复杂度:--


以上仅是个人思路解法,觉得还不错欢迎点赞关注分享


往期精彩推荐



扫描下方二维码,关注公众号,更多精彩等你发现


以上是关于二叉树(十三)-- 另一棵树的子树的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《二叉树》简单08 —— LeetCode 572. 另一棵树的子树

算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历

572. 另一棵树的子树

572. 另一棵树的子树

二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客

二叉树oj ----> 另一棵树的子树