【數據結構】:樹的先序,中序,后序遍歷Python實現


我們先建立一棵簡單的二叉樹:

 

 代碼如下所示:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


l1 = TreeNode(1)
l2 = TreeNode(2)
l3 = TreeNode(3)
l4 = TreeNode(4)
l5 = TreeNode(5)
l6 = TreeNode(6)
l7 = TreeNode(7)

l1.left = l2
l1.right = l3
l2.left = l4
l2.right = l5
l3.left = l6
l3.right = l7

然后進行先序遍歷:

def pretravale(treenode):
    if treenode==None:
        return None
    print(treenode.val)
    pretravale(treenode.left)
    pretravale(treenode.right)

中序:

#利用深度優先搜索進行中序遍歷
def midtravale(treenode):
    if treenode==None:
        return None
    midtravale(treenode.left)#先往左走到底,然后打印根節點
    print(treenode.val)
    midtravale(treenode.right)

后序:

def latetravale(treenode):
    if treenode == None:
        return None
    latetravale(treenode.left)
    latetravale(treenode.right)
    print(treenode.val)

打印遍歷結果:

pretravale(l1)
print("開始中序遍歷")
midtravale(l1)
print("開始后序便遍歷")
latetravale(l1)

得到:

1
2
4
5
3
6
7
開始中序遍歷
4
2
5
1
6
3
7
開始后序便遍歷
4
5
2
6
7
3
1

當然面試官看到你使用遞歸解法來遍歷這棵樹肯定是不滿意的,因此這里給出對這棵樹的迭代解法,首先是先序遍歷,在遍歷的時候我們可以一直往左進行入棧,當棧中沒有元素可以添加之后,也就是樹的左端的元素已經沒了變成了None,那么我們彈出最尾端的元素,如果說最尾端有元素的話就再次對最尾端的元素的left進行遍歷,如果沒有則返回到上一級的樹根。

#  使用非遞歸的方式進行先序遍歷
def preOrder(root):
    if root==None:
        return None
    stack=[]
    tmpNode=root
    while tmpNode or stack:#不能為空
        while tmpNode:
            print(tmpNode.val)
            stack.append(tmpNode)
            tmpNode=tmpNode.left#繼續找這個跟節點的左子樹
            #將左子樹一直放到里面,直到沒有左子樹

        node = stack.pop()
        tmpNode = node.right# 假設node.right為空則tmpNode也為空
        #如果不為空的話,那么node.right就賦值給新的tmpNode

中序遍歷我們改變一下打印的順序就好了,畢竟都是深度優先搜索(DFS):

#中序遍歷
def midOrder(root):
    if root==None:
        return None
    stack=[]
    tmpNode=root
    while tmpNode or stack:#不能為空
        while tmpNode:
            #print(tmpNode.val)
            stack.append(tmpNode)
            tmpNode=tmpNode.left#繼續找這個跟節點的左子樹
            #將左子樹一直放到里面,直到沒有左子樹

        node = stack.pop()
        print(node.val)
        tmpNode = node.right# 假設node.right為空則tmpNode也為空
        #如果不為空的話,那么node.right就賦值給新的tmpNode

后續遍歷的迭代解法可以留給大家自己去思考


免責聲明!

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



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