算法题-平衡二叉树
Posted IT界的泥石流
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题-平衡二叉树相关的知识,希望对你有一定的参考价值。
一棵树是否为平衡二叉树
题目
判断一棵树是否是平衡二叉树
平衡二叉树
平衡二叉树的提出就是为了保证树不至于太倾斜,尽量保证两边平衡。因此它的定义如下:
(1) 平衡二叉树要么是一棵空树
(2) 要么保证左右子树的高度之差不大于 1子树也必须是一颗平衡二叉树
也就是说,树的两个左子树的高度差别不会太大。
他的应用极为广泛,其中包括AVL树、红黑树、SB树(Size Balanced Tree,它是一种平衡二叉查找树。它的论文由中国广东中山纪念中学的陈启峰于2006年底完成,并在Winter Camp 2007中发表。由于SBT的拼写很容易找到中文谐音,它常被中国的OIer们戏称为 “傻B树)。它们都是具有某一种平衡性的搜索二叉树,接下来我们说一下如何判断一棵树是否具有平衡性,即一棵树或者它的子树中的左右子树的高度差不超过1。
如何判断?
其思路非常清晰和简单,首先从根节点开始,先判断左右子树的高度差是否超过1,然后接着判断左右子树是否是平衡二叉树。这是一种从底到顶的递归思路,把从低到高的高度逐层往上返回,如果遇到某一棵子树不为平衡树,则一路往上返回false,如何是子树为平衡术,则返回true以及这棵子树的高度。
代码
public static class ReturnType {
public int level;
public boolean isB;
public ReturnType(int l, boolean is) {
level = l;
isB = is;
}
}
// process(head, 1)
public static ReturnType process(Node head, int level) {
if (head == null) {
return new ReturnType(level, true);
}
ReturnType leftSubTreeInfo = process(head.left, level + 1);
if(!leftSubTreeInfo.isB) {
return new ReturnType(level, false);
}
ReturnType rightSubTreeInfo = process(head.right, level + 1);
if(!rightSubTreeInfo.isB) {
return new ReturnType(level, false);
}
if (Math.abs(rightSubTreeInfo.level - leftSubTreeInfo.level) > 1) {
return new ReturnType(level, false);
}
return new ReturnType(Math.max(leftSubTreeInfo.level, rightSubTreeInfo.level), true);
}
下期题目
判断一棵二叉树是否是完全二叉树,欢迎留言提供思路。
以上是关于算法题-平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章
每日算法题 | 剑指offer 二叉树专题 (16) 平衡二叉树