面试题之根据先序,中序,后序重构二叉树

1. 根据先序和中序遍历重构二叉树

已知二叉树先序遍历和中序遍历生成的列表,根据所给列表重构出二叉树。

1.1 题解思路

二叉树的先序遍历的思想是:根节点->左孩子>右孩子

二叉树的中序遍历的思想是:左孩子->根节点->右子树

因此,先序遍历每个节点是中序遍历的序列的根节点,将中序遍历分割成左右两部分,分别对应树的左右子树。

1.2  Python3实现方式

preorder: 先序遍历序列; inorder: 中序遍历序列

# coding:utf-8
class TreeNode(object):
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None


def buildTree(preorder:list, inorder:list) ->TreeNode:
    def contruct(pre_left, pre_right, in_left, in_right):
        if pre_left > pre_right:
            return None
        val = preorder[0]
        root = TreeNode(val)
        in_ind = inorder.index(val)
        sub_node = in_ind - in_left
        root.left = contruct(pre_left+1, pre_left+sub_node, in_left, in_ind-1)
        root.right = contruct(pre_left+sub_node+1,pre_right,in_ind,in_right)
        return root
    n = len(preorder)
    return contruct(0, n-1, 0, n-1)

2. 根据后序遍历和中序遍历重构二叉树

已知二叉树中序遍历和后序遍历生成的列表,根据所给列表重构出二叉树。

2.1 题解思路

二叉树中序遍历:左子树->根节点->右子树

二叉树后序遍历:  左孩子->右孩子->根节点

后序遍历从后往前节点每个节点在是中序遍历序列的根节点,将中序遍历分成左右两个部分,分别代表左右子树。

2.2 Python3实现

inorder:中序遍历序列;postorder: 后序遍历序列

def in_post_binary_tree(inorder:list, postorder:list):
    def contruct(inleft, inright):
        if inleft > inright:
            return None
        val = postorder.pop()
        root = TreeNode(val)
        root_ind = inorder.index(val)
        root.right = contruct(root_ind+1, in_right)
        root.left = contruct(inleft, root_ind-1) 
        return root
    n = len(inorder)
    return contruct(0, n-1)

你可能感兴趣的:(数据结构,数据结构)