LeetCode | 0106. Construct Binary Tree from Inorder and Postorder Traversal從中序與後序遍歷序列構造二叉樹【Python】

LeetCode 0106. Construct Binary Tree from Inorder and Postorder Traversal從中序與後序遍歷序列構造二叉樹【Medium】【Python】【二叉樹】【遞歸】

Problem

LeetCode

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

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

For example, given

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

Return the following binary tree:

    3
   / \
  9  20
    /  \
   15   7

問題

力扣

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。

注意:
你可以假設樹中沒有重複的元素。

例如,給出

中序遍歷 inorder = [9,3,15,20,7]
後序遍歷 postorder = [9,15,7,20,3]

返回如下的二叉樹:

    3
   / \
  9  20
    /  \
   15   7

思路

遞歸

中序遍歷:左根右
後序遍歷:左右根

於是,每次取後序遍歷末尾的值,表示根,再到中序遍歷中確定索引。
再根據索引,分割成左子樹和右子樹。如此遞歸。

注意:
保證遞歸的 inorder 和 postorder 個數一致。

時間複雜度: O(n),n 爲節點個數。
空間複雜度: O(n),n 爲節點個數。

Python3代碼
# 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, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not postorder:
            return None
        root = TreeNode(postorder[-1])

        # 根在中序遍歷中的索引
        i = inorder.index(root.val)
        # left: inorder[0] ~ inorder[i-1], postorder[0] ~ postorder[i-1]
        root.left = self.buildTree(inorder[:i], postorder[:i])
        # right: inorder[i+1] ~ inorder[-1], postorder[i] ~ postorder[-2]
        root.right = self.buildTree(inorder[i+1:], postorder[i:-1])

        return root

代碼地址

GitHub鏈接

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