leetcode:572. 另一棵树的子树
题目
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
示例 1:![[简单] 572. 另一棵树的子树 - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/b9d899f061a19e461509657c8c9172dc.jpeg)
输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true
示例 2:![[简单] 572. 另一棵树的子树 - 图2](/uploads/projects/liangduo-rjrcs@ggu4wq/4380af1eefe9b3ad7e9f02851129d9cb.jpeg)
输入:root = [3,4,5,1,2,null,null,null,null,0], subRoot = [4,1,2]输出:false
解答 & 代码
DFS 遍历二叉树 root 的每个节点,记为 node
比较
node和subRoot的值是否相同,若相同,则 DFS 同时遍历node子树和subRoot树,判定两棵树是否相同/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/class Solution {private:// DFS 比较两棵树是否相同bool isSameTree(TreeNode* root1, TreeNode* root2){if(root1 == nullptr && root2 == nullptr)return true;if(root1 == nullptr || root2 == nullptr)return false;return root1->val == root2->val &&isSameTree(root1->left, root2->left) &&isSameTree(root1->right, root2->right);}public:// DFS 检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树bool isSubtree(TreeNode* root, TreeNode* subRoot) {if(subRoot == nullptr)return true;if(root == nullptr)return false;return (root->val == subRoot->val && isSameTree(root, subRoot)) ||isSubtree(root->left, subRoot) ||isSubtree(root->right, subRoot);}};
复杂度分析:设二叉树
root节点数为 m,二叉树subRoot节点数为 n时间复杂度 O(mn):dfs 遍历二叉树
root的每个节点node,时间复杂度 O(m);对每个节点node,判断以node为根节点的树和subRoot是否相同,时间复杂度 O(n)- 空间复杂度 O(log n):
执行结果:
执行结果:通过执行用时:20 ms, 在所有 C++ 提交中击败了 68.27% 的用户内存消耗:27.9 MB, 在所有 C++ 提交中击败了 95.12% 的用户
