力扣题目
解题思路
java代码
力扣题目:
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
示例 1:
输入:root = [3,4,5,1,2], subRoot = [4,1,2] 输出:true
示例 2:
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2] 输出:false
解题思路:
算法原理:
这道题通过递归的方式来判断一个树是否是另一个树的子树。
思路:
isSubtree
方法首先判断当前根节点,如果为空则返回false
。然后判断当前根节点和子树根节点是否相同,如果相同则调用isSameTree
方法进一步确认。如果不同,则分别在左子树和右子树中递归调用isSubtree
方法来查找子树。isSameTree
方法用于判断两棵树是否完全相同。如果两棵树的根节点都为空,返回true
。如果其中一个为空,另一个不为空,返回false
。如果根节点值相同,且左子树和右子树也都相同,返回true
,否则返回false
。
代码分析:
- 在
isSubtree
中,通过条件判断和递归调用在整棵树中查找子树。 isSameTree
中通过递归判断树的节点值和结构是否完全一致。
时间复杂度:
- 假设主树节点数为
m
,子树节点数为n
,isSameTree
的时间复杂度为,
isSubtree
的时间复杂度为。
空间复杂度:
- 空间复杂度主要取决于递归调用栈的深度,最坏情况下为
。
java代码:
package org.example;
public class Leetcode572 {
public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(4);
root.right = new TreeNode(5);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(2);
TreeNode subRoot = new TreeNode(4);
subRoot.left = new TreeNode(1);
subRoot.right = new TreeNode(2);
System.out.println(isSubtree(root, subRoot));
}
public static boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (root == null) return false;
return isSameTree(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
public static boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) return true;
if (p == null || q == null) return false;
return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项