本文主要是介绍LC 572.另一棵树的子树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
572. 另一棵树的子树
给你两棵二叉树 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
提示:
root
树上的节点数量范围是[1, 2000]
subRoot
树上的节点数量范围是[1, 1000]
- − 1 0 4 ≤ r o o t . v a l ≤ 1 0 4 -10^4 \leq root.val \leq 10^4 −104≤root.val≤104
- − 1 0 4 ≤ s u b R o o t . v a l ≤ 1 0 4 -10^4 \leq subRoot.val \leq 10^4 −104≤subRoot.val≤104
解法一(迭代+暴力匹配)
思路分析:
- 对二叉树
root
采用前序遍历进行遍历,寻找与二叉树subRoot
的根节点相等的节点,找到某节点后,判断以该节点为根节点的子树 是否与subRoot
相等。
实现代码如下:
class Solution {public boolean isSubtree(TreeNode root, TreeNode subRoot) {// 使用统一迭代进行二叉树遍历Deque<TreeNode> stack = new LinkedList<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();if (node.val == subRoot.val) { // 若出现与subRoot的根节点值相等 则进一步判断是否为子树if (isSameTree(node, subRoot))return true; // 为子树 则直接返回true}if (node.right != null) stack.push(node.right);if (node.left != null) stack.push(node.left);}return false;}// 判断两棵树是否相等private 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);}
}
提交结果如下:
解答成功:
执行耗时:5 ms,击败了14.15% 的Java用户
内存消耗:43.1 MB,击败了8.66% 的Java用户
复杂度分析:
- 时间复杂度: O ( m ⋅ n ) O(m \cdot n) O(m⋅n),subRoot是子树,且刚好遍历整个root
- 空间复杂度: O ( m + n ) O(m+n) O(m+n),递归调用和前序遍历root
这篇关于LC 572.另一棵树的子树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!