1.二叉搜索樹:若它的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值;若它的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值; 它的左、右子樹也分別爲二叉排序樹。(即中序遍歷狀況下,值依次增大)node
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 層全部的結點都連續集中在最左邊,這就是徹底二叉樹。(除了最後一層以外的其餘每一層都被徹底填充,而且全部結點都保持向左對齊。)app
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。②左右子樹都是平衡二叉樹。spa
第一種寫法:遞歸返回判斷結果和子節點深度code
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
第二種常見寫法:blog
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)