判断二叉树是否为二叉搜索树、完全二叉树、平衡二叉树 Python实现

博客介绍了三种二叉树。二叉搜索树左子树结点值小于根结点,右子树结点值大于根结点,中序遍历值依次增大;完全二叉树除最后一层外各层结点数达最大,最后一层结点左对齐;平衡二叉树左右子树深度差绝对值不大于1,且左右子树也为平衡二叉树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。(即中序遍历情况下,值依次增大

# 二叉搜索树
# 中序遍历情况下,值递增则为二叉树
def isBSTree(head):
    minimum = -100000               # 设定一个最小值
    if head is None:
        return False
    prenum = minimum
    stack = []
    while head or len(stack) > 0:
        if head:
            stack.append(head)
            head = head.left
        else:
            head = stack.pop()
            if head.val < prenum:   # 保证中序遍历情况下值递增
                return False
            else:
                prenum = head.val
            head = head.right
    return True

2.完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。

 1 # 判断一棵树是否为完全二叉树
 2 # 左无、右有 ==> 返回 False
 3 # 左无、右无 ==> 激活判断:之后所有节点都是叶节点
 4 # 左有、右无 ==> 激活判断:之后所有节点都是叶节点   ==》 只要右无之后都必须是叶节点
 5 # 左有、右有 ==> 不用处理
 6 import queue
 7 def isCBTree(head):
 8     if not head:
 9         return False
10     que = queue.Queue()
11     que.put(head)
12     flag = False                                # 是否激活判断过程
13     while not que.empty():
14         head = que.get()
15         if head.left:
16             que.put(head.left)
17         if head.right:
18             que.put(head.right)
19 
20         if (not head.left) and head.right:      #左空、又不空必不为CBT
21             return False
22 
23         if flag:                                # 若过程激活则判断节点是否为叶节点
24             if head.left or head.right:
25                 return False
26 
27         if not (head.left and head.right):      # 左不空、右空 | 左空、右空
28             flag = True                         # 激活判断在此之后的节点必须为叶节点
29 return True

3.平衡二叉树:平衡二叉树是一棵二叉树,其可以为空,或满足如下2个性质:①左右子树深度之差的绝对值不大于1。②左右子树都是平衡二叉树

第一种写法:递归返回判断结果和子节点深度

1 # 判断二叉树是否为平衡二叉树
 2 # 先判断该节点是否平衡
 3 # 再递归去判断左节点和右节点是否平衡
 4 def process(head):
 5     if head is None:
 6         return True, 0
 7     leftData = process(head.left)
 8     if not leftData[0]:
 9         return False, 0
10     rightData = process(head.right)
11     if not rightData[0]:
12         return False, 0
13     if abs(leftData[1]-rightData[1]) > 1:
14         return False, 0
15     return True, max(leftData[1],rightData[1]) + 1

第二种常见写法:

1 # 判断二叉树是否为平衡二叉树
 2 # 先判断该节点是否平衡
 3 # 再递归去判断左节点和右节点是否平衡
 4 
 5 # 递归求当前节点的深度
 6 def getdepth(node):
 7     if not node:
 8         return 0
 9     ld = getdepth(node.left)
10     rd = getdepth(node.right)
11     return max(ld, rd) + 1
12 
13 
14 def isB(head):
15     if not head:
16         return True
17     ld = getdepth(head.left)
18     rd = getdepth(head.right)
19     if abs(ld - rd) > 1:
20         return False
21     return isB(head.left) and isB(head.right)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值