zoukankan      html  css  js  c++  java
  • [剑指Offer]重建二叉树

    题目描述

    输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
    solution:
     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     TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
    13       //left-close-right-open 
    14       return RebuildBST(pre,vin,0,pre.size(),0,vin.size());
    15       
    16     }
    17     TreeNode* RebuildBST(vector<int> pre,vector<int> vin,int preBegin,int preEnd,int inBegin,int inEnd)
    18     {
    19       if(preBegin >= preEnd || inBegin>=inEnd) return nullptr;
    20       int rootCur = pre[preBegin];
    21       TreeNode* root = new TreeNode(rootCur);
    22       int rootPos = 0;
    23       for(rootPos = inBegin;rootPos<inEnd;rootPos++)
    24       {
    25         if(vin[rootPos] == rootCur)
    26         {
    27           break;
    28         }
    29       }
    30       root->left = RebuildBST(pre,vin,preBegin + 1, preBegin + rootPos - inBegin + 1 ,inBegin,rootPos);
    31       root->right = RebuildBST(pre,vin,preBegin + rootPos - inBegin + 1, preEnd,rootPos + 1,inEnd);
    32 
    33       return root;
    34     }
    35 };
    View Code

    思考:

    • 先序遍历提供根节点,中序遍历寻找根节点后即可成功划分子树,如此递归即可。
    • 对于代码中出现的区间问题,统一采用“左开右闭”的方案,将会简化问题
  • 相关阅读:
    Python开发【第六篇】循环语句
    Python开发【第四篇】语句与函数
    Python开发【第三篇】数据类型
    Python开发【第二篇】:初始Python
    2019-10-11入博客第一篇文章
    vim学习2-文档编辑
    vim学习1-入门指令
    linux学习9-进程管理知识
    linux学习8-正则表达式基础
    linux学习7-数据流重定向
  • 原文地址:https://www.cnblogs.com/Swetchine/p/11291701.html
Copyright © 2011-2022 走看看