1. 程式人生 > >LeetCode105:Construct Binary Tree from Preorder and Inorder Traversal

LeetCode105:Construct Binary Tree from Preorder and Inorder Traversal

Given preorder and inorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

For example, given

preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

LeetCode:

連結

劍指offer同題:劍指Offer_程式設計題04:重建二叉樹

本題為前序遍歷和中序遍歷,最少需要兩種遍歷方式,才能重建二叉樹。

前序遍歷序列中,第一個數字總是樹的根結點的值。在中序遍歷序列中,根結點的值在序列的中間,左子樹的結點的值位於根結點的值的左邊,而右子樹的結點的值位於根結點的值的右邊。剩下的我們可以遞迴來實現。

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

class Solution(object):
    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if not preorder:
            return None
        '''當列表中只剩下一個值時,一定要注意返回的是preorder[0],而不是preorder 而且一定要TreeNode'''
        if len(preorder) == 1:
            return TreeNode(preorder[0])
        '''先找到根節點 要定義成TreeNode樣式'''
        root = TreeNode(preorder[0])
        '''根據根節點數值定義到中序序列的index'''
        index = inorder.index(preorder[0])
        root.left = self.buildTree(preorder[1:index+1], inorder[:index])
        root.right = self.buildTree(preorder[index+1:], inorder[index+1:])
        return root