题目
leetcode572. 另一棵树的子树
思路
递归解决。
①递归的大问题化小----判断c是否为a子树可以转换为判断c是否为a左子树的子树或者c是否为a右子树的子树。
②递归的结束条件-----如果两颗树相同,返回true;两棵树为空,返回true;子树不为空但是另一棵树为空
关于如何判断两棵树相同,可以看这篇文章👇leetcode572. 另一棵树的子树http://t.csdn.cn/TjK6g
代码
bool isSameTree(struct TreeNode* p, struct TreeNode* q){
//2棵空树相同
if (p == NULL && q == NULL)
return true;
//一棵树为空,另一棵树不为空不相同
if (q != NULL && p == NULL || q == NULL && p != NULL)
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){
//空树是空树的子树
if (root == NULL && subRoot == NULL)
return true;
//子树不为空但是另一棵树为空
if (root == NULL && subRoot != NULL)
return false;
//两棵树一样
if (isSameTree(root, subRoot))
return true;
//大问题化小
return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}