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


免責聲明!

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



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