7.重建二叉樹

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

複習知識點:二叉樹的遍歷

前中後序指的是根節點的順序,左總在右的前面

前序遍歷的順序是:根節點,左子節點(左子樹),右子節點(右子樹)。

中序遍歷的順序是:左子節點,根節點,右子節點。

後序遍歷的順序是:左子節點,右子節點,根節點。

這三種遍歷都有遞歸和循環兩種不同的實現方式,每種遍歷的遞歸實現都比循環實現簡潔很多。

由遍歷順序重構二叉樹:其實就是把前序遍歷中得到的根節點在中序遍歷中找到就可以分出左右子樹,不斷重複這個過程

Python題解:

# -*- coding:utf-8 -*-
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
class Solution:
    # 返回構造的TreeNode根節點
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        return self.findSubTree(pre,tin)

    def findSubTree(self,front,mid):
        if len(front)==0:
            #print('null')
            return None
        if len(front)==1:
            #print('return value '+str(front[0]))
            return TreeNode(front[0])
        else:
            r = TreeNode(front[0])
            index = mid.index(front[0])
            #print('root:',front[0])
            #print('尋找 '+str(front[0])+' 的左子樹')
            r.left=self.findSubTree(front[1:index+1],mid[0:index])
            #print('尋找 '+str(front[0])+' 的右子樹')
            r.right=self.findSubTree(front[index+1:],mid[index+1:])
        #print('子樹 '+str(front[0])+' 結束')
        return r

以前序遍歷[1,2,4,7,3,5,6,8]和中序遍歷[4,7,2,1,5,3,8,6]爲例,上述代碼中的print取消註釋,得到的重構二叉樹過程如下:

('root:', 1)
尋找 1 的左子樹
('root:', 2)
尋找 2 的左子樹
('root:', 4)
尋找 4 的左子樹
null
尋找 4 的右子樹
return value 7
子樹 4 結束
尋找 2 的右子樹
null
子樹 2 結束
尋找 1 的右子樹
('root:', 3)
尋找 3 的左子樹
return value 5
尋找 3 的右子樹
('root:', 6)
尋找 6 的左子樹
return value 8
尋找 6 的右子樹
null
子樹 6 結束
子樹 3 結束
子樹 1 結束

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章