网站怎么做推广,成都分销商城网站建设,aspnet网站开发实例教程课件,中建交通建设集团有限公司网站572. 另一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在#xff0c;返回 true #xff1b;否则#xff0c;返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tr…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) {// 使用统一迭代进行二叉树遍历DequeTreeNode 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(mn) O(mn)递归调用和前序遍历root