利用三种遍历结构:
输入:中序序列和后序序列(中序序列和前序序列),都为list[ ]结构;
前序: 根左右,可以根据这个结构先确定根的值,和位置。就是序列的第一个值
中序:左根右
后序:左右根, 可以根据序列判别树的根节点的值和位置。也就是后序序列最后一个值。
从中序与后序遍历序列构造二叉树
# 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, postorder):
"""
:type inorder: List[int]
:type postorder: List[int]
:rtype: TreeNode
"""
if len(inorder) == 0:
return None
if len(inorder) == 1:
return TreeNode(inorder[0])
root_val = postorder[-1]
root = TreeNode(root_val)
idx = inorder.index(root_val)
root.left = self.buildTree(inorder[:idx], postorder[:idx])
root.right = self.buildTree(inorder[idx+1:], postorder[idx: -1]) #### inorder[idx+1 :]特别注意
return root
从前序与中序遍历序列构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 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, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if len(preorder) == 0:
return None
if len(preorder) == 1:
return TreeNode(preorder[0])
root_val = preorder[0]
root = TreeNode(root_val)
idx = inorder.index(root_val)
root.left = self.buildTree(preorder[1:idx+1], inorder[:idx])
root.right = self.buildTree(preorder[idx+1:], inorder[idx+1:])
return root
互相学习,互相讨论。