zoukankan      html  css  js  c++  java
  • 【剑指offer】10-重建二叉树

    题目:

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

    例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。


    思考:

    二叉树前序遍历,第一个数就是根节点,在中序遍历中找到该根节点的位置,就能区分出左右子树。再而在左右子树中,分别找到前序遍历中的根节点,重复上述操作。---> 递归!!

    # -*- 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
            if len(pre) <= 0 or len(tin) <= 0:
                return None
            root = TreeNode(pre[0])  # 从前序遍历中找根节点,找到后放入treenode中
            pos = tin.index(pre[0])  # 在中序遍历中找到根节点的位置
    
            tinLeft = tin[:pos]  # 中序遍历中的左子树
            tinRight = tin[pos+1:]
    
            preLeft = pre[1:pos+1]  # 前序遍历中的左子树
            preRight = pre[pos+1:]
    
            # 再重新将分出来的左子树,的前序和中序遍历,看成新的遍历,递归
            root.left = self.reConstructBinaryTree(preLeft, tinLeft)
            root.right = self.reConstructBinaryTree(preRight, tinRight)
            return root

     写的时候遇到的问题:

    1. 特殊情况的考虑:没有前序/中序遍历的情况;前序/中序长度为0的情况

    2. pre[0]就是根节点,但是要把它放入二叉树TreeNode中!TreeNode中的left就是左子树,right是右子树

    3. root现在既然是TreeNode类,就会有left和right

  • 相关阅读:
    使文字背景透明
    文件拷贝
    鼠标选取图象的实现
    刷新整个画布
    将区域的颜色取反
    用API处理位图
    用TImageList动态画透明图片
    将bmp文件转换为jpg文件
    解决phpmyadmin-1800秒超时链接失效问题
    Linux下解压命令大全
  • 原文地址:https://www.cnblogs.com/RebeccaG/p/11966461.html
Copyright © 2011-2022 走看看