1. 程式人生 > >python二叉樹及葉節點獲取 (面試題)

python二叉樹及葉節點獲取 (面試題)

才疏學淺,智商不夠,花了一晚上看了二叉樹。記錄一下:

 

1.二叉樹的遍歷

前序遍歷:根節點->左子樹->右子樹

中序遍歷:左子樹->根節點->右子樹 

後序遍歷:左子樹->右子樹->根節點

 

三層二叉樹:
             A
         ↙  ↘
      B          C
   ↙ ↘     ↙ ↘
 D       E  F      G
前序:

先把BDE,CFG看做是A的左右子節點,因此是從A開始讀,A作為第一個,然後進到左子節點 BDE, 這時再把它看做一個小二叉樹看待,其
順序為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 = right
        
class 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