zoukankan      html  css  js  c++  java
  • 重建二叉树

    题目描述

      输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    算法设计思想

      前序遍历序列的第一个元素为根结点,然后在中序遍历序列中寻找根节点位置(索引)。

      从中序遍历序列起始位置根结点的值的位置(不包含)为根结点左子树中序遍历序列;从中序遍历序列根结点的值的位置(不包含)到结束位置根结点右子树中序遍历序列;相应的,从前序遍历序列的第二个元素开始的根结点左子树结点数个元素的子序列为根结点左子树前序遍历序列,从下一个元素开始,直到结束位置的子序列为根结点右子树前序遍历序列。如图 2.7 所示,

    # -*- coding:utf-8 -*-
    # class TreeNode:
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    class Solution:
        # 返回构造的TreeNode根节点
        def reConstructBinaryTree(self, pre, tin):
            # write code here
            if not pre or not tin:
                return None
            # 前序遍历的第一个结点一定是根结点
            root = TreeNode(pre.pop(0))
            index = tin.index(root.val)
            # 递归构造左子树和右子树
            root.left = self.reConstructBinaryTree(pre,tin[:index])
            root.right = self.reConstructBinaryTree(pre,tin[index+1:])
            return root
    

     二叉树的遍历是一个典型的递归问题,如果题目没有特殊要求,递归必然是最简单的方法

  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/tianqizhi/p/9607045.html
Copyright © 2011-2022 走看看