func isBalanced(root *TreeNode) bool {
if root == nil {
return true
}
return height(root) >= 0
}
func height(root *TreeNode) int {
if root == nil {
return 0
}
left := height(root.Left)
right := height(root.Right)
if left == -1 || right == -1 || abs(left - right) > 1 {
return -1
}
return max(left, right) + 1
}
func max(x, y int) int {
if x < y {
return y
}
return x
}
func abs(x int) int {
if x < 0 {
return -1 * x
}
return x
}
class Solution {
//bfs后序排序,剪枝
public boolean isBalanced(TreeNode root) {
return digui(root)!=-1;
}
private int digui(TreeNode root){
if (root==null){
return 0;
}
int left = digui(root.left);
if(left==-1)return -1;
int right = digui(root.right);
if(right==-1)return -1;
return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
}
/*public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}*/
}
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
if not root:
return True
return abs(self.find(root.left)-self.find(root.right))<=1 and self.isBalanced(root.left)and self.isBalanced(root.right)
def find(self,root):
if not root: return 0
return max(self.find(root.left),self.find(root.right))+1
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null)
return true;
int BL = maxDepth(root.left);
int BR = maxDepth(root.right);
return isBalanced(root.left)&&isBalanced(root.right)&&Math.abs(BL-BR)<2;
}
public int maxDepth(TreeNode root) {
if(root == null)
return 0;
int L = maxDepth(root.left);
int R = maxDepth(root.right);
return L>R ?L+1 : R+1;
}
}
class Solution {
//判断二叉树是否平衡,先算出他的左高度和右高度,再用递归的思想,判断他的左子树和右子树是否平衡,不平衡直接返回,
//平衡时,判断左高度和右高度的大小差,该节点是否平衡
//时间复杂度O(n^2)
//空间复杂度O(n^2)
public boolean isBalanced(TreeNode root) {
if(root==null){
return true;
}
int left = depth(root.left);
int right = depth(root.right);
Boolean l = isBalanced(root.left);
if(l==false)return l;
Boolean r = isBalanced(root.right);
if(r==false)return r;
return (left-right<=1&&right-left<=1?true:false);
}
public int depth(TreeNode root){
if(root == null){
return 0;
}
int left = 0;
int right = 0;
left += depth(root.left);
right += depth(root.right);
return (left>=right?left+1:right+1);
}
}
class Solution:
def isBalanced(self, root: TreeNode) -> bool:
def deep (root:TreeNode) -> int:
if root is None:
return 0
else:
l = deep(root.left)
r = deep(root.right)
return max(l,r) + 1
if not root :
return True
else:
return abs(deep(root.left) - deep(root.right)) <= 1 and self.isBalanced(root.left) and self.isBalanced(root.right)
共以下 56 个回答
O(N^2) 递归
O(N) 记忆化搜索,不过优化表现并不好
O(N) 递归 求高度的同时判断是否平衡,不平衡就使用特殊量返回(-1)
C++
1. 先考虑平衡二叉树的判断: 深度不能相差1
2. 递归遍历整个数
3. 递归退出条件就是递归到叶子节点
/**
* 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:
bool isBalanced(TreeNode root) {
if(root NULL) return true;
else if(root != NULL && root->left NULL && root->right NULL) return true;
if(abs(Depth(root->right)-Depth(root->left)) > 1) return false;
return isBalanced(root->right) && isBalanced(root->left);
}
int Depth(TreeNode* root) {
if(root NULL) return 0;
if(root != NULL && root->left NULL && root->right NULL) return 1;
return max(Depth(root->right)+1, Depth(root->left)+1);
}
};
时间O(N),空间O(N)
可以剪枝,自底而上,下面不平衡了后面也不要判定了
“`cpp
“`
可以在计算树的深度的时候加一个剪枝
自己的思路笨重。学习帅老师的剪枝思路,在计算深度的时候就顺便算了,这也给自己一个启示就是当能在一次操作完成的事情,尽量不重复两次。但是要多思考(:
时间复杂度 O(N): N 为树的节点数;最差情况下,需要递归遍历树的所有节点。
空间复杂度 O(N): 最差情况下(树退化为链表时),系统递归需要使用 O(N)的栈空间。
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n^2)
空间复杂度:O(N)
思路一:前序遍历的方式判断以每一个节点为根节点的树是否是平衡二叉树,需要写个getHeight()函数取得每一个节点的深度。前序遍历需要遍历每一个节点一次,对于每一个节点p,getHeight(p)最多被调用d次(getHeight(p)在遍历到p的祖先节点都会被调用),d为p的高度,对于一个树来说,树的高度一般为logN,d为p节点的高度,所以d<=logN,所以一般的时间复杂度为O(NlogN),对于链式结构的树,时间复杂度为(N^2)。
思路二:前序遍历对于同一个节点会重复调用它的getDepth(TreeNode)函数,可以采用后序遍历的方式,自低而上的递归,先递归的判断其左右子树是否平衡,当判断以该节点为根节点的树是否是平衡二叉树,如果是返回它的深度,否则返回-1。
时间复杂度On
空间复杂度On
递归还是经验不足,写的太少了
时间空间O(n)
时间复杂度:O(n)
空间复杂度:O(n)
迭代,参考上一题思路,判断左右子树高度差
后序遍历递归算深度(whatever),对于不平衡的子树返回-1,如果有任意一个子树返回-1,则递归返回-1。
时间O(n),空间O(n)
思路:利用上一道题实现的方法即可解决这一道题
时间复杂度:O(n)
空间复杂度:O(n)
1、时间复杂度O(n) 空间复杂度O(n)
看这个代码风格,看来都是一个老师出来的,哈哈哈
时间:O(n)
空间:O(n)
还是递归,我有想到,但也发现了一些错误
平衡二叉树的左子树与右子树深度差不超过1。
时间复杂度:O(n)
空间复杂度:O(n)
额外
深度优先搜索,自顶向上递归
深度搜索,判断左右子树高度,
时间O(n)
空间0(n)
深搜
O(n)
O(n)
解题方法:对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 -1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。
时间复杂度:O(n)
空间复杂度:O(n)
递归
对二叉树做后序遍历,从底至顶返回子树深度,若判定某子树不是平衡树则 “剪枝” ,直接向上返回。
先序遍历 + 判断深度 (从顶至底)
计算两边子树的高度
时间复杂度 O(n)
思路:后序遍历 + 剪枝 (从底至顶)
时间复杂度O(n),空间复杂度O(lgn)。
时间:O(n),空间O(n)
延用递归的思路,注意点是利用后序遍历计算左右子树最大深度的差值判断是否 > 1。时间O(n) 空间O(n)
//递归
//递归写法
class Solution {
public:
int fun(TreeNode* root){
if(!root) return 0;
int l=fun(root->left);
int r=fun(root->right);
if(l-1 || r-1) return -1;
if(abs(l-r)>1) return -1;
return 1+max(l,r);
}
bool isBalanced(TreeNode* root) {
if(!root) return true;
return fun(root)-1? false:true;
}
};