python二叉樹及葉節點獲取 (面試題)
阿新 • • 發佈:2018-12-27
才疏學淺,智商不夠,花了一晚上看了二叉樹。記錄一下:
1.二叉樹的遍歷
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
三層二叉樹:
A
↙ ↘
B C
↙ ↘ ↙ ↘
D E F G
前序:
順序為BDF,讀完這個,以A為根的三個結構就讀完了根左,然後剩下CFG,這時在讀CFG。到此為止,這組二叉樹的前序組合為ABDRCFG,這種讀法
從上往下,從根開始,把下面所有節點結構都以根左右的形式讀取,遇到有子節點的情況變讀左子節點,讀完再讀右。總結其格式:從根開始,找左,
以左為根,找左,若無,找右,以右為根,找左,若無,找右,若無,找上一級右,以此類推。
中序:先把BDE,CFG看做是A的左右子節點,A1,A2。中序的讀法為左根右,A1,A,A2。然後再看A1,D為左,B為中,E為右,D為葉節點
(無子節點了),因此從D開始DBE,A1讀完,然後為A,再看A2,A2為FCG,因此中序的順序為:DBE>A>FCG。
後序:左右根,A1,A2,A。A1在左右根:DEB,A2是FGC,A1,A2,A便是DEBFGCA。
鞏固練習:
前序遍歷:abdefgc
中序遍歷:debgfac
後序遍歷:edgfbca
Q:尋找二叉樹所有葉節點:
class Node(object): """節點類""" def __init__(self, val=-1, left=None, right=None): self.val = val self.left = left self.right = rightclass Tree(object): """樹類""" def __init__(self): self.root = Node() self.queue = [] #使用列表模擬佇列 def add(self, val): """為樹新增節點""" node = Node(val) if self.root.val == -1: # 如果樹是空的,則對根節點賦值 self.root = node self.queue.append(self.root) else: treeNode = self.queue[0] # 此結點的子樹還沒有齊。 if treeNode.left == None: treeNode.left = node # 左子樹變成節點(初始此節點左右都是None) self.queue.append(treeNode.left) else: treeNode.right = node self.queue.append(treeNode.right) self.queue.pop(0) # 如果該結點存在右子樹,將此結點丟棄。 def leave(self,root): if root==None: return 0 elif root.left ==None and root.right == None : return 1 else: return (self.leave(root.left)+self.leave(root.right)) # 遞迴遍歷所有左子樹右子樹,當左右都為None時才算1 if __name__ == '__main__': """主函式""" vals = range(10) #生成十個資料作為樹節點 tree = Tree() #新建一個樹物件 for val in vals: tree.add(val) #逐個新增樹的節點 print ('葉子節點個數:', tree.leave(tree.root))
感謝:
https://blog.csdn.net/harrytsz/article/details/80866150
https://blog.csdn.net/qq_36197940/article/details/77482493
https://www.cnblogs.com/joangaga/p/7066551.html