数据结构算法之判断是否为平衡二叉树

数据结构

什么叫平衡二叉树?

如果在一棵二叉树中,任何一个子树的左右子树的深度差(高度差)不超过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

总结

两种方法的根本原理都是通过递归判断左右子树的高度差是否满足条件,区别只是在于一个自顶向下,一个自底向上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值