根據前序遍歷和中序遍歷構建二叉樹

根據樹前序遍歷和中序遍歷構建二叉樹

問題:已知一個二叉樹前序遍歷爲:ABDEGCFH,中序遍歷爲:DBGEACHF,則該二叉樹的後序遍歷爲?python

思路是這樣的:1:根據前序遍從來肯定每次根節點的位置,由於前序遍歷先訪問的是根節點,因此前序遍歷第一個位置就是根節點。 2:根據根節點和中序遍歷將樹劃分爲左右兩棵樹。3:根據第一步和第二步遞歸的處理左右兩棵樹。post

第一步:根據前序遍歷 A B D E G C F H 肯定頭結點是A,根據中序遍歷 D B G E A C H F 將樹劃分爲左子樹 D B G E 和右子樹 C H F
第二步:劃分爲左右兩棵子樹:對於左子樹,前序遍歷是 B D E G,後續遍歷是 D B G E。對於右子樹,前序遍歷是 C F H,後續遍歷是 C H F
第三步:對左子樹和右子樹分別運用第一步和第二步進行分析。
遞歸結束的條件:當中序遍歷的節點只剩下一個節點的時候,那麼這個節點就是葉子節點。ui

總體的操做流程以下:
code

Python代碼以下:blog

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

class Solution:
    def reConstructBinaryTree(self, pre, tin):
        """根據前序遍歷和中序遍從來重建一顆二叉樹,要求前序遍歷和中序遍歷當中字符不重複
        Args:
          pre: 前序遍歷  list類型或者者str類型
          tin: 中序遍歷  
        Returns:
          head: 一個TreeNode類型的根節點
        """
        return self.rebuild_tree(pre, 0, len(pre)-1, tin, 0, len(tin)-1)

    def rebuild_tree(self, pre, pre_start, pre_end, tin, tin_start, tin_end):
         """遞歸的進行樹的重建"""
        if pre_start > pre_end or tin_start > tin_end:
            return None

        head = TreeNode(pre[pre_start])
        tin_mid = tin.index(pre[pre_start])
        left_length = tin_mid - tin_start

        head.left = self.rebuild_tree(pre, pre_start+1, pre_start+left_length, 
                                      tin, tin_start, tin_mid-1)
        head.right = self.rebuild_tree(pre,pre_start+left_length+1, pre_end, 
                                       tin, tin_mid+1, tin_end)
                                       
        return head

def post_order_print(head):
    """之後序遍歷的方式打印一顆二叉樹"""
    if head is None:
        return
    post_order_print(head.left)
    post_order_print(head.right)
    print(head.val,end='')
if __name__ == '__main__':
    pre = 'ABDEGCFH'
    tin = 'DBGEACHF'
    s = Solution()
    head = s.reConstructBinaryTree(pre, tin)
    post_order_print(head)  # result: DGEBHFCA

根據樹後序遍歷和中序遍歷構建二叉樹

道理是同樣的,根據後序遍從來肯定根節點的位置,因爲後序遍歷最後訪問根節點, 因此此時最後一個節點就是根節點。根據中序遍從來劃分左右子樹,而後迭代求解。遞歸

根據樹前序遍歷和中序遍歷不能構建惟一的二叉樹

前序和後序在本質上都是將父節點與子結點進行分離,但並無指明左子樹和右子樹的能力,所以獲得這兩個序列只能明確父子關係,而不能肯定一個二叉樹。
好比前序遍歷爲ABC,後續遍歷爲CBA,能夠構造出下面兩棵樹,能夠發現這並不惟一:
it

相關文章
相關標籤/搜索