572.另一颗树的子树

📅 2026/8/5 17:51:29
572.另一颗树的子树
目录一题目二思路三代码四递归展开图一题目解释判断root中是否有额subRoot一样的子树所以若存在则该子树和subRoot是相同的数而100.相同的数算法题已经讲过相同的树算法题博客二思路很简单既然你要在root中找到一颗子树和subRoot完全相同则我们只需遍历root中的每一个节点将该节点和subRoot节点进行判断是否为相等的树即可终止条件①遍历root树中的节点发现节点为空则代表这条递归线路遍历到了空节点都还没找到和和subRoot为相等的树则返回上级false②遍历root树中的节点此节点不为空且此节点为根节点的树和subRoot为相等树则返回true递归条件遍历root树中的节点此节点不为空且此节点为根节点的数和subRoot不是相等树则递归取此节点的左孩子和右孩子继续和subRoot比较左子树和右子树只要一方有和subRoot相等的树则代表找到了三代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ //相同的树 bool isSameTree(struct TreeNode*p,struct TreeNode*q) { if(pNULL qNULL)//两个都为空 代表结构和值都相同 return true;//真 if(pNULL || qNULL)//一方为空 则结构不同 值都没有比较的意义 return false;//假 if(p-val ! q-val)//结构相同 但节点都不为空 则对比值 return false;//假 //来到这里 代表两棵树的当前节点 都存在 值都等 //则递归检查两个树的当前节点的左节点 且 当前节点的右节点 return isSameTree(p-left,q-left) isSameTree(p-right,q-right); } bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) { //遍历时 发现节点为空 则返回上级false if(root NULL) return false; //不为空 则先判断节点和subRoot根节点的值是否相等 //只有相等了 才代表有相等的树的可能 if(root-val subRoot-val) { if(isSameTree(root,subRoot))//判断是否为相等的树 return true;//相等 返回true } //不相等 遍历当前节点的左孩子和subRoot继续比较 || 右孩子和subRoot继续比较 //当前节点的左右子树中只要一方有和subRoot相等的树 就算找到了 所以|| return isSubtree(root-left,subRoot) || isSubtree(root-right,subRoot); }解释①需要注意root和subRoot节点的值相等才有必要去调用isSameTree函数判断是否为相等的树虽然可以去掉判断代码直接调用isSameTree函数但没必要判断一下逻辑更优秀②递归的时候其实就是在左子树和右子树里面继续找有没有一个节点root和subRoot是相等树所以只要一方存在相等树即可符号选择||四递归展开图左右 [ 作者 ] shylyly [ 首次发布 ] 2024.8.28❌ [ 最新修改 ] 2026.8.4 [ 声明 ] 由于笔者水平有限文中难免有疏漏或不妥之处还望读者不吝赐教