面試題 07. 重建二叉樹(Python3)

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

 

例如,給出

前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:

    3
   / \
  9  20
    /  \
   15   7

給出的初始代碼爲:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:

 

解題思路

利用遞歸的思想

給定preoder和inorder:

  • 根節點必爲preorder的第一個元素preorder[0];
  • 找到inorder中preorder[0]所在的位置index;
  • 那麼,inorder中index之前的index個元素即爲左子樹的中序遍歷;inorder中index之後的(n-index-1)個元素即爲右子樹的中序遍歷;
  • 而preorder的第2個~第(index+1)個元素即爲左子樹的前序遍歷;preorder的最後(n-index-1)個元素即爲右子樹的前序遍歷。
  • 從而分別得到左子樹和右子樹的preoder和inorder,繼而完成遞歸。

如下圖所示:

 

 

代碼如下

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if (not preorder): # 空樹
            return None
        else:
            tree = TreeNode(preorder[0])    # 頂點
            index = inorder.index(preorder[0])  # 中序遍歷中左右樹的分界點
            # index左邊的即爲左子樹的inorder;右邊亦然
            left_inorder = inorder[:index]
            right_inorder = inorder[index+1:len(inorder)]
            # 頂點後的index個數構成的list即爲左子樹的preorder;最後的即爲右子樹的preorder
            left_preorder = preorder[1:1+index]
            right_preorder = preorder[1+index:len(preorder)]

            # 遞歸生成樹
            tree.left = self.buildTree(left_preorder,left_inorder)
            tree.right = self.buildTree(right_preorder,right_inorder)

            return tree

 

遇到的問題

在初始代碼中,僅根據給出的TreeNode類中的__init__()函數,self.right, self.left都是None。那怎麼給TreeNode賦值呢?

難道要更改class TreeNode中的代碼?

當然是在Solution裏寫啊!比如root = TreeNode(3), 那麼給左子樹和右子樹賦值只需要root.left = XXX; root.right = XXX.即可

還是對Python基礎差對面向對象不熟啊!

 

 

 

 

 

 

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