不知道你有没有刷到过力扣那些二叉树简单题,看解析简简单单三四行代码,但是这样的题多了后,就被绕的摸不着头脑,本篇就打算将这类型的题全部总结一遍,全部都用递归的思路解决。
对于这类型的题来说,大都是bool类型判断。一般分两类:
对于单树而言,首先要有递归结束条件,一般都是特殊的判断,比如判断是否为空。比如:
if(!root) return true/false;
if(!root->left) return true/false/递归函数;
if(!root->right) return true/false/递归函数;
对于双树问题,也是如此:
if(!root) return true/false;
if(!root->left) return true/false/递归函数;
if(!root->right) return true/false/递归函数;
下面就根据具体的题来具体分析。
class Solution {
public:
bool isSameTree(TreeNode* p, TreeNode* q) {
if(!p && !q)
return true;
if(!p || !q)
return false;
return p->val == q->val && isSameTree(p->left, q->left) && isSameTree(p->right, q->right);
}
};
class Solution {
public:
int maxDepth(TreeNode* root) {
if(!root)
return 0;
return max(maxDepth(root->left)+1, maxDepth(root->right)+1);
}
};
根节点左右子树高度差 <= 1 + 左子树是平衡二叉树 + 右子树是平衡二叉树
class Solution {
public:
bool isBalanced(TreeNode* root) {
if(!root)
return true;
int left = maxDepth(root->left);
int right = maxDepth(root->right);
if(abs(left-right) > 1)
return false;
return isBalanced(root->left) && isBalanced(root->right);
}
int maxDepth(TreeNode* root) {
if(!root)
return 0;
return max(maxDepth(root->left)+1, maxDepth(root->right)+1);
}
};
class Solution {
public:
bool isUnivalTree(TreeNode* root) {
if(!root)
return true;
int val = root->val;
if(root->left && root->left->val != val)
return false;
if(root->right && root->right->val != val)
return false;
return isUnivalTree(root->left) && isUnivalTree(root->right);
}
};
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(!root)
return root;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1)
return root2;
if(!root2)
return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
return root1;
}
};
这题需要构造辅助函数。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return check(root->left, root->right);
}
bool check(TreeNode* left, TreeNode* right) {
if(!left && !right)
return true;
if(!left || !right)
return false;
return left->val == right->val && check(left->left, right->right) && check(left->right, right->left);
}
};
class Solution {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(!root || !subRoot)
return false;
if(isSameTree(root, subRoot))
return true;
return isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
bool isSameTree(TreeNode* root1, TreeNode* root2) {
if(!root1 && !root2)
return true;
if(!root1 || !root2)
return false;
return root1->val == root2->val && isSameTree(root1->left, root2->left) && isSameTree(root1->right, root2->right);
}
};
注意区分这个题和572的区别,这个只需要部分满足就可以了,不需要两棵树完全相同。
class Solution {
public:
bool isSubStructure(TreeNode* A, TreeNode* B) {
if(!A || !B)
return false;
if(isSubtree(A, B))
return true;
return isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
bool isSubtree(TreeNode* a, TreeNode* b) {
if(!b)
return true;
if(!a || a->val != b->val)
return false;
return isSubtree(a->left, b->left) && isSubtree(a->right, b->right);
}
};