110. Balanced Binary Tree
仅供自己学习
思路:
自顶向下:
可以递归到最低层开始计算层数,当root为NULL时,就返回0,说明是最底一层。然后到上一个递归,因为上一个递归的root不为空,那么我们就return 左右子树中的最大层数+1,那么倒数第二层就是0+1,如此就能得到一个子树的最大深度了。这就是递归函数的内容,即获得最大深度。
主函数的内容就是判断源节点是否为空,如果不为空就return 源节点的左子树深度减去右子树深度的绝对值是否小于等于1,不是只等于1是因为还有[1]只有一个元素的情况。主函数是返回结果的函数,如果只是判断深度是否小于等于1,是不对的,因为有可能左右子树最深深度相差为1,但是是不平衡的,所以我们同时要判断源节点的left和right子树是否为平衡的,同样要从最底层开始往上判断,所以我们return还要递归主函数。
因为是递归的判断左右子树深度是否大于1,同时判断左右子树是否平衡,所以是自顶向下的
因为会遍历到每个节点,那么就是O(n),然后对于深度为d的节点p,会调用d次求深度的函数,因为遍历各子树,则为O(logn),那么就是O(nlogn)。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int high(TreeNode* root){
if(root==NULL) return 0;
return max(high(root->left),high(root->right))+1;
}
bool isBalanced(TreeNode* root) {
if(root==NULL) return true;
return abs(high(root->left)-high(root->right))<=1&&isBalanced(root->left)&&isBalanced(root->right);
}
};
自底向上:
因为自顶向上会把所有结点都遍历,并且会重复遍历各子树。所以我们自底向上,如果遇到失衡的情况就直接返回-1退出,并且不会重复遍历子树。再计算高度的同时同时判断失衡,就能不用重复递归树了。
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int high(TreeNode* root){
if(root==NULL) return 0;
int rt;
int lt;
if((rt=high(root->right))==-1||(lt=high(root->left))==-1||abs(rt-lt)>1) return -1;
return max(rt,lt)+1;
}
bool isBalanced(TreeNode* root) {
if(root==NULL) return true;
return high(root)!=-1;
}
};