利用三种遍历结构:
输入:中序序列和后序序列(中序序列和前序序列),都为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
互相学习,互相讨论。