数据结构
什么叫平衡二叉树?
如果在一棵二叉树中,任何一个子树的左右子树的深度差(高度差)不超过1,则该二叉树输入平衡二叉树,否则不是。
上面这种就属于平衡二叉树,因为任意一个子树的左右子树高度差不超过1
下面则不属于平衡二叉树
判断方法有两种:
1. 从上往下依次递归判断
首先假设当前的头结点高度为1,每往下走一层高度+1,只要当前节点不为None,则递归获取当前节点的左子树高度和右子树高度;
在每轮递归时都要判断当前左子树和右子树的高度差是否大于1,如果大于1,则直接返回False;
如果小于等于1,则返回当前节点中,左子树和右子树高度值最大的那一个,作为当前节点的高度(因为该节点的深度取决于它最深的子节点);
Python代码如下:
class Node():
def __init__(self, data):
self.value = data
self.left = None
self.right = None
def isBalance(head):
res = True # 是否为平衡树
level = 1
lev, res = getHigh(head, level, res) # 假设头节点高度为1
return res
def getHigh(head, level, res):
if head == None:
return level, res
left = getHigh(head.left, level + 1, res) # 递归求左子树高度
if res == False:
return level, res
right = getHigh(head.right, level + 1, res) # 递归求右子树高度
if res == False:
return level, res
if abs(left - right) > 1: # 高度差
res = False
return max(left, right), res
2. 从下往上
和第一种方法不同的是,这里假设最后一层的高度为1(子节点为None时高度为 0),然后从下往上依次递归判断每一个子树是否平衡;
代码如下:
def down2up(node):
if node == None: return 0
left = down2up(node.left)
if left == -1: return -1 # -1 表示该子树不平衡
right = down2up(node.right)
if right == -1: return -1
if abs(left - right) > 1:
return -1
return max(left, right) + 1 # 从下往上高度依次+1
if down2up(head) == -1:
return False
else:
return True
总结
两种方法的根本原理都是通过递归判断左右子树的高度差是否满足条件,区别只是在于一个自顶向下,一个自底向上。