1. 程式人生 > >【算法】【python實現】二叉樹深度、廣度優先遍歷

【算法】【python實現】二叉樹深度、廣度優先遍歷

遞歸 for 以及 ima 後序 one treenode 針對 列表

  二叉樹的遍歷,分為深度優先遍歷,以及廣度優先遍歷。

在深度優先遍歷中,具體分為如下三種:

  • 先序遍歷:先訪問根節點,再遍歷左子樹,再遍歷右子樹;
  • 中序遍歷:先遍歷左子樹,再訪問根節點,再遍歷右子樹;
  • 後序遍歷:先遍歷左子樹,再遍歷右子樹,再訪問根節點;

技術分享圖片

針對上圖二叉樹,三種遍歷結果為:

  • 先序遍歷:50,20,15,30,60,70
  • 中序遍歷:15,20,30,50,60,70
  • 後序遍歷:15,30,20,70,60,50

實現代碼如下:

# 定義二叉樹節點
class TreeNode(object):
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

#定義二叉樹類
class BinaryTree(object):
    def __init__(self,root=None):
        self.root=root

    def preOrder(self,retList=[],node=‘root‘):
        if node!=None:
            retList.append(node)
            self.preOrder(retList,node.left)    # 遞歸調用,將左子節點放到列表裏  
            self.preOrder(retList,node.right)    # 遞歸調用,將右節點放到列表裏  
        return retList

    def inOrder(self,retList=[],node=‘root‘):
        if node!=None:
            self.inOrder(retList,node.left)
            retList.append(node)
            self.inOrder(retList,node.right)
        return retList
    def postOrder(self,retList=[],node=‘root‘):
        if node!=None:
            self.postOrder(retList,node.left)
            self.postOrder(retList,node.right)
            retList.append(node)
        return retList
                     

if __name__==‘__main__‘:
    rootNode=TreeNode(50)
    rootNode.left = TreeNode(20,left=TreeNode(15),right=TreeNode(30))
    rootNode.right = TreeNode(60,right=TreeNode(70))
    binaryTree=BinaryTree(rootNode)
    ret = binaryTree.preOrder([],binaryTree.root)
    for i in ret:
        print(i.val,end=‘.‘)
    print(‘\n‘+‘-‘*20)
    ret = binaryTree.inOrder([],binaryTree.root)
    for i in ret:
        print(i.val,end=‘.‘)
    print(‘\n‘+‘-‘*20)
    ret = binaryTree.postOrder([],binaryTree.root)
    for i in ret:
        print(i.val,end=‘.‘)
    

  

【算法】【python實現】二叉樹深度、廣度優先遍歷