平衡二叉树对于查询效率的优化有重要意义,这次问题是输入一颗二叉树,判断该树是否为平衡二叉树。
我最开始理解的二叉树其实就是最大高度和最小高度差值小于或则等于1。并用代码实现出来:
1、分别找到树的最小深度和最大深度并求出差值即可。
if(root == null) return false;
//定义两个值分别存放最大深度和最小深度
int min = 0,max = 0;
//每一层的节点
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
list.add(root);
while(list.size() != 0)
{
//只要每一层的节点列表不为空就max递增
max ++;
ArrayList<TreeNode> tempList = new ArrayList<TreeNode>();
//设置一个布尔变量,判断是否存在左右孩子为空的节点
boolean isEmpty = false;
for(TreeNode treeNode : list)
{
if(treeNode.left != null) tempList.add(treeNode.left);
if(treeNode.right != null) tempList.add(treeNode.right);
if(treeNode.left == null && treeNode.right == null) isEmpty = true;
}
//如果没有那么一个节点,左右子树都为空min自增
if(!isEmpty) min++;
list = tempList;
}
//判断是否为平衡树
if(max - min != 1 && max - min != 0) return false;
return true;
按照我的意思实现了代码,自己用测试用例去,没有发现问题。
但是后来却发现无法完全通过在线的测试用例。重新去查找了平衡二叉树的概念之后才发现自己对于概念的理解错误了。
- 百科对于平衡二叉树的解释为:平衡二叉树(Balanced Binary
Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一
棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
的确跟自己理解的出现了偏差,好吧,推倒重来。看来多锻炼算法数据结构对于概念的重新理解也有很大帮助。
问题已经发现了,分析这个问题,竟然左右子树的高度差,那就分别求出左右子树的高度差吧。由于高度差这个代码块是重复的,因此构造一个方法拿来复用即可。这样有助于代码的简洁和规范易维护。
public boolean IsBalanced_Solution(TreeNode root) {
if(root == null) return true;
//设置一个布尔变量,是否为平衡树
int d = getTreeDeep(root.left) - getTreeDeep(root.right);
if(d == 1 || d == 0 || d == -1) return true;
return false;
}
private int getTreeDeep(TreeNode root)
{
if(root == null) return 0;
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
list.add(root);
int deep = 0;
while(list.size() != 0)
{
deep ++;
ArrayList<TreeNode> layerList = new ArrayList<TreeNode>();
for(TreeNode treeNode : list)
{
if(treeNode.left != null) layerList.add(treeNode.left);
if(treeNode.right != null) layerList.add(treeNode.right);
}
list = layerList;
}
return deep;
}
成功通过所有测试用例。