判斷二叉樹是否為二叉搜索樹、完全二叉樹、平衡二叉樹 Python實現


1.二叉搜索樹:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。(即中序遍歷情況下,值依次增大

 1 # 二叉搜索樹
 2 # 中序遍歷情況下,值遞增則為二叉樹
 3 def isBSTree(head):
 4     minimum = -100000               # 設定一個最小值
 5     if head is None:
 6         return False
 7     prenum = minimum
 8     stack = []
 9     while head or len(stack) > 0:
10         if head:
11             stack.append(head)
12             head = head.left
13         else:
14             head = stack.pop()
15             if head.val < prenum:   # 保證中序遍歷情況下值遞增
16                 return False
17             else:
18                 prenum = head.val
19             head = head.right
20     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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM