剑指 Offer 55 - II. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)
题意
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路1
按照题意从上往下的进行判断,对于根节点为root的节点,先求左子树的深度,再求右子树的深度,判断两者深度之差是否超过1.
然后再递归下去分别判断左子树和右子树是否为平衡二叉树。
时间复杂度退化为O(n^2)
因为每个节点都要递归求深度,一直在不断重复的计算。
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==nullptr) return 0;
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
bool isBalanced(TreeNode* root) {
if(root==nullptr) return true;
int depl=maxDepth(root->left);
int depr=maxDepth(root->right);
return (abs(depl-depr)<=1)&&isBalanced(root->left)&&isBalanced(root->right);
}
};
思路2
还有一种从下向上的递归,对于当前遍历到的root节点,先递归的判断左子树跟右子树是否为平衡二叉树,如果是的话,返回高度;否则,返回-1;再判断当前节点的左子树右子树是否相差为1.
这样每个节点都会经过一遍,时间复杂度O(n)
代码2
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL) return 0;
int depl=maxDepth(root->left);
int depr=maxDepth(root->right);
if(depl==-1||depr==-1) return -1;
if(abs(depl-depr)>1) return -1;
return max(depl,depr)+1;
}
bool isBalanced(TreeNode* root) {
return maxDepth(root)>=0;
}
};