zoukankan      html  css  js  c++  java
  • 已知二叉树的前序和中序遍历,重构该二叉树

    这套题来自于牛客网剑指offer的第四题,由于本题涉及到了对树的递归操作,而且在边界上自己计算时犯了小错误,这里记录一下:

    题目描述如下:

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
     
    解题思路:
    1.由树的先序遍历可以求树的根节点,
    2.根据根节点的位置在中序遍历中找到树左右子树的元素,
    3.递归1,2操作找到所有子树的结构。
     
    注:
    需要说明的是在重构左右子树的过程中的边界的计算,不然会造成越界或是计算错误。
     
    代码如下:
     1 /**
     2  * Definition for binary tree
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 public:
    12     struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in)
    13     {
    14         TreeNode *tree = reBulidBinaryTree(pre,0,pre.size()-1,in,0,in.size()-1);
    15          
    16         return tree;
    17     }
    18 public:
    19    struct TreeNode* reBulidBinaryTree(vector<int> pre,int pre_start,int pre_end,vector<int> in,int in_start,int in_end)
    20    {
    21  
    22        if(pre_start > pre_end|| in_start > in_end)
    23        {
    24            return NULL;
    25        }
    26         
    27        TreeNode *root = new TreeNode(pre.at(pre_start));
    28  
    29        int i;
    30  
    31        for(i = in_start; i <= in_end; i++)
    32        {
    33            if(in.at(i) == pre.at(pre_start))
    34            {//find the position where in order traverse value is the root of the tree
    35                     root->left = reBulidBinaryTree(pre,pre_start+1,pre_start+i-in_start,in,in_start,i-1);//重构左子树
    36                     root->right = reBulidBinaryTree(pre,pre_start+i-in_start+1,pre_end,in,i+1,in_end);//重构右子树
    37                     break;
    38            }
    39        }
    40  
    41        return root;
    42    }
    43  
    44 };
  • 相关阅读:
    ADB命令无法导出文件到物理机上处理办法
    mysql 分页offset过大性能问题解决思路
    0.通用编程基础
    win10去除快捷方式小箭头
    Java经典编程题
    win10家庭版打开组策略
    js常用事件列表
    计算器 输入式子计算结果 (字符串、抛异常)
    题库
    MyEclipse自动补全设置
  • 原文地址:https://www.cnblogs.com/daimadebanyungong/p/4919665.html
Copyright © 2011-2022 走看看