110 平衡二叉树
程序员文章站
2022-03-03 10:35:59
...
题目
- 方法一:自顶向下递归
/**
* 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:
//判断是否为平衡二叉树
bool isBalanced(TreeNode* root) {
if(root==NULL) return true;
return abs(height(root->left)-height(root->right))<2 && isBalanced(root->left) && isBalanced(root->right);
}
//计算高度
int height(TreeNode* root){
if(root == NULL) return 0;
else return max(height(root->left), height(root->right))+1;
}
};
-
时间复杂度O(n^2)
-
空间复杂度O(logn)
-
思路
- 如果一棵二叉树是平衡二叉树,则其一定满足根节点的左子树和右子树高度的绝对值之差小于等于1,且左子树和右子树均为平衡二叉树
- 对于当前节点,如果它为空,则表示是平衡二叉树,否则判断它的左右子树是否为平衡二叉树且高度差绝对值小于1
- 计算二叉树的高度,如果它为空则高度为0,否则,它的高度为它左子树高度与右子树高度的较大者加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:
bool isBalanced(TreeNode* root) {
return balanceHeight(root)>-1;//如果高度不是-1则表示该节点为平衡二叉树
}
int balanceHeight(TreeNode* root){
if(root == NULL) return 0;//如果为空表示其父亲节点为树叶,返回0
int left = balanceHeight(root->left);//判断其左子树是否为平衡二叉树
int right = balanceHeight(root->right);//判断其右子树是否为平衡二叉树
if(left<0 || right<0 || abs(left-right)>1) return -1;//判断以root为根的树是否为平衡二叉树,如果不是则返回-1,否则返回其高度
return max(left, right)+1;
}
};
- 时间复杂度O(n)
- 空间复杂度O(logn)
- 思路
- 在计算高度的同时判断是否为二叉搜索树。计算高度方法为左子树与右子树较大者加1,判断是否为平衡二叉树的方法为左右子树均为平衡二叉树且左子树减右子树高度取绝对值是否小于1。二者是相统一的。
- 自底向上递归计算当前节点的高度。
- 如果当前节点为空,返回高度为0.
- 递归计算它的左子树和右子树的高度。
- -1表示该树不是平衡二叉树。如果左子树或右子树不是平衡二叉树或它们的高度差绝对值大于1,返回它的高度为-1.
- 否则返回左子树和右子树二者高度较大者加1.
上一篇: 617、合并二叉树
下一篇: Java递归删除指定文件夹下所有文件