题解 | #树的子结构#
树的子结构
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88
class Solution {
public:
bool panduan(TreeNode* p1,TreeNode* p2){
if(p1 == NULL && p2 != NULL) return false; //主树先空不对
if(p1 == NULL || p2 == NULL) return true; //主树空或不空无所谓,只要子树该节点空了,就ok
if(p1->val != p2->val) return false; //两个都不空 值不一样返回false
else return panduan(p1->left,p2->left) && panduan(p1->right,p2->right); //值一样两个都往下判断,直到p2为空为止
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(pRoot1 == NULL || pRoot2 == NULL) return false; //只要有一个是空的,本次判断无需执行
bool flag1 = panduan(pRoot1,pRoot2); //去判断当前的两个节点
bool flag2 = HasSubtree(pRoot1->left,pRoot2); //如果flag1不成立,就去判断主树的左和右
bool flag3 = HasSubtree(pRoot1->right,pRoot2);//相当于遍历了主树的每个节点,只要有一个情况的panduan是true,那结果就是true
return flag1 || flag2 || flag3;
}
};
//根据对称的二叉树那个题和结合本题答案来写的
//最初时候想的用递归去判断这个flag2和flag3的逻辑发现无法实现
查看11道真题和解析