两个题几乎是一模一样的
首先给出leetcode512的解答,两个递归,注意isSubtree的递归
因为,主树的节点与子树的节点值不相等的时候,需要一直遍历主树去找有没有跟子树根节点相等的值
class Solution {
public:
bool compare(TreeNode* root, TreeNode* subRoot){
if(root == NULL && subRoot == NULL) return true;
if(root == NULL && subRoot != NULL) return false;
else if(root != NULL && subRoot == NULL) return false;
else if(root->val != subRoot->val) return false;
bool leftCompare = compare(root->left, subRoot->left);
bool rightCompare = compare(root->right, subRoot->right);
return leftCompare && rightCompare;
}
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root == NULL && subRoot != NULL) return false;
return compare(root, subRoot) || isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
};
与剑指offer的不同点在于:
- 剑指offer输入的节点数 n可以等于0,当子树的节点数为0时,需要在leetcode上再加一个递归的终止条件
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
//递归终止条件:针对subRoot为空节点的情况
if(root != NULL && subRoot == NULL) return false;
if(root == NULL && subRoot != NULL) return false;
return compare(root, subRoot) || isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}