描述
输入一棵节点数为 n 二叉树,判断该二叉树是否是平衡二叉树。
在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树
平衡二叉树(Balanced Binary Tree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
样例解释:
样例二叉树如图,为一颗平衡二叉树
注:我们约定空树是平衡二叉树。
数据范围:n \le 100n≤100,树上节点的val值满足 0 \le n \le 10000≤n≤1000
要求:空间复杂度O(1)O(1),时间复杂度 O(n)O(n)
输入描述:
输入一棵二叉树的根节点
返回值描述:
输出一个布尔类型的值
我的思路
首先,平衡二叉树就是判断这个高度的绝对值是否为[0,1]。不要再乱写代码了!一般平衡二叉树是有一个平衡因子的,所以我们现在如果没有思路可以先手写一个平衡因子,捋一下这个过程。由于我们计算的是每个节点下面有多少个节点,然后平衡因子是左树的节点数减去右树的节点,最后返回的是根节点的平衡因子。所以这里需要设置两个参数。
我一开始写的错误代码:
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
//将初始的节点和高度传进去
if (dfs04(root,0) <= 1)
return true;
else
return false;
}
//我是想设置两个参数,一个是本节点下面节点的个数,
// 一个是该节点下面有几个节点,
// 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
private int dfs04(TreeNode root, int high) {
if (root == null)
return 0;
int left = dfs04(root.left,high + 1);
//每遍历下一层high,也就算节点+1
int right = dfs04(root.right,high +1);
//这个也是同样的道理
//好像无意识的用了后序
return Math.abs(left - right);
}
这样写也是错误的,因为它会返回你一开始调用的那个值,那不就是00了。
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
//将初始的节点和高度传进去
if (dfs04(root,0) <= 1)
return true;
else
return false;
}
//我是想设置两个参数,一个是本节点下面节点的个数,
// 一个是该节点下面有几个节点,
// 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
private int dfs04(TreeNode root, int high) {
if (root == null)
return 0;
dfs04(root.left,high + 1);
int leftHight = high;
high = 0;
//每遍历下一层high,也就算节点+1
dfs04(root.right,high +1);
int rightHight = high;
//这个也是同样的道理
//好像无意识的用了后序
return Math.abs(leftHight - rightHight);
}
这里其实不用记录high,直接在返回值+1就好了。
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
//将初始的节点和高度传进去
if (dfs04(root) <= 1)
return true;
else
return false;
}
//我是想设置两个参数,一个是本节点下面节点的个数,
// 一个是该节点下面有几个节点,
// 最后的平衡因子应该是根节点的左子树节点减去右子树节点的绝对值
private int dfs04(TreeNode root) {
if (root == null)
return 0;
int left = dfs04(root.left);
//每遍历下一层high,也就算节点+1
int right = dfs04(root.right);
//这个也是同样的道理
//好像无意识的用了后序
return Math.abs(left - right) +1;
}
但是还是出现问题
我忽略了是整棵树的深度,而不是单个左树深度或者右树深度。要记住,这个很重要。
正确运行代码:
public boolean IsBalanced_Solution(TreeNode root) {
if (root == null)
return true;
return dfs04(root) == -1 ? false : true;
}
private int dfs04(TreeNode root) {
if (root == null)
return 0;
int left = dfs04(root.left);
if (left == -1)
return -1;
int right = dfs04(root.right);
if (right == -1)
return -1;
return Math.abs(left - right) < 2 ? Math.max(left,right) + 1 : -1;
}