二叉树的构建是一个常常考察的内容,有关二叉树的题目一般是使用递归方法解决,但是找到合适的递归方程很关键。

前序遍历:先看根节点,然后是左子树,最后是右子树。

中序遍历:先看左子树,然后是根节点,最后是右子树。

后序遍历:先看左子树,然后是右子树,最后是根节点。


前序: 根左右,可以根据这个结构先确定根的值,和位置。就是序列的第一个值

中序:左根右

后序:左右根, 可以根据序列判别树的根节点的值和位置。也就是后序序列最后一个值。


接下来列出前+中构建二叉树的Python代码实现:

class Node:
    def __init__(self, data, left, right):
        self.data = data
        self.left = left
        self.right = right


def construct_tree(pre_order, mid_order):
    # 忽略参数合法性判断
    if len(pre_order) == 0:
        return None
    # 前序遍历的第一个结点一定是根结点
    root_data = pre_order[0]
    i = mid_order.index(root_data)  # 取出mid_order中根节点位置,左边的是左子树,右边的是右子树
    # 递归构造左子树和右子树
    left = construct_tree(pre_order[1: 1 + i], mid_order[:i])  # pre_order里其余元素都在i后,所以前序中只有根节点一个在左子树;mid_order里左子树元素都在i左边
    right = construct_tree(pre_order[1 + i:], mid_order[i + 1:])  # pre_oder里其余元素都在i后,所以中序中其余节点都在右子树;mid_order里右子树元素都在i右边
    return Node(root_data, left, right)

 中+后生成二叉树:  Leetcode 106.

# 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, inorder, postorder):
        """
        :type inorder: List[int]
        :type postorder: List[int]
        :rtype: TreeNode
        """
        if not postorder:
            return None
        root = TreeNode(postorder[-1])  # 后序最后一个节点是根节点
        n = inorder.index(root.val)  # 取出中序中根节点的index,可以快速判别左右子树
        root.left = self.buildTree(inorder[:n], postorder[:n])  # 在中序中,根节点的左子树元素都在左边;在后序中,根节点的右子树元素也都在左边
        root.right = self.buildTree(inorder[n+1:], postorder[n:-1])  # 在中序中,根节点的右子树元素都在右边;在后序中,也都在左边,但是就不取最后一个元素了,因为最后一个是根
        return root

 

加油!!

 

分类:

技术点:

相关文章: