zoukankan      html  css  js  c++  java
  • *剑指Offer07 重建二叉树

    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

    例如,给出

    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:

    3
    /
    9 20
    /
    15 7

    前序遍历第一个数即为当前的根节点,再根据该节点的值可以在中序遍历中划分出左子树和右子树,递归下去就可以重建二叉树。

     1 /**
     2  * Definition for a binary tree node.
     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* buildTree(vector<int>& preorder, vector<int>& inorder) {
    13         int n=preorder.size();
    14         if(!n) return nullptr;
    15         int* ptrpreorder=&preorder[0];
    16         int* ptrinorder=&inorder[0];
    17         return Construct(ptrpreorder,ptrpreorder+n-1,ptrinorder,ptrinorder+n-1);
    18     }
    19 
    20     TreeNode* Construct(int* startpreorder, int* endpreorder, int* startinorder, int*endinorder){
    21         int rootval=startpreorder[0];
    22         TreeNode* curroot= new TreeNode();
    23         curroot->val=rootval;
    24         curroot->left=curroot->right=nullptr;
    25 
    26         if(startpreorder==endpreorder){
    27             if(startinorder==endinorder && *startpreorder==*startinorder)
    28                 return curroot;
    29         }
    30 
    31         int* rootinorder=startinorder;
    32         while(rootinorder<=endinorder && *rootinorder!=rootval)
    33             rootinorder++;
    34         
    35         int leftlen=0,rightlen=0;
    36         leftlen=rootinorder-startinorder;
    37         int* leftendpreorder=startpreorder+leftlen;
    38         if(leftlen){
    39             curroot->left=Construct(startpreorder+1,leftendpreorder,startinorder,rootinorder-1);
    40         }
    41 
    42         if(rootinorder!=endinorder){
    43             curroot->right=Construct(leftendpreorder+1,endpreorder,rootinorder+1,endinorder);
    44         }
    45         return curroot;
    46     }
    47 };

    第二次做,加入了用全局变量记录错误信息。

     1 /**
     2  * Definition for a binary tree node.
     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 
    11 enum{Valid,InValid};
    12 int g_buildTree=Valid;
    13 
    14 class Solution {
    15 public:
    16     TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    17         int n=preorder.size();
    18         if(n!=inorder.size() || !n){
    19             g_buildTree=InValid;
    20             return nullptr;
    21         }
    22         TreeNode* root= recursive_build(preorder,inorder,0,n-1,0,n-1);
    23         return root;
    24     }
    25 
    26     TreeNode* recursive_build(vector<int>& preorder, vector<int>& inorder, int startpre, int endpre, int startin, int endin){
    27         if(startpre==endpre){
    28             TreeNode* leaf=new TreeNode(preorder[startpre]);
    29             return leaf;
    30         }
    31 
    32         TreeNode* curroot=new TreeNode(preorder[startpre]);
    33         int leftlen=0;
    34         for(int i=startin;i<=endin;++i){
    35             if(inorder[i]==preorder[startpre]){
    36                 leftlen=i-startin;
    37                 break;
    38             }
    39         }
    40 
    41         if(leftlen){      
    42             curroot->left=recursive_build(preorder,inorder,startpre+1,startpre+leftlen,startin,startin+leftlen-1);
    43         }
    44         if(startpre+leftlen!=endpre){
    45             curroot->right=recursive_build(preorder,inorder,startpre+leftlen+1,endpre,startin+leftlen+1,endin);
    46         }
    47 
    48         return curroot;
    49     }
    50 
    51 
    52 
    53 };
  • 相关阅读:
    Aspnet_regsql.exe命令行使用小结
    ListView用法学习
    < %=...%>< %#... %>< % %>< %@ %>
    jQuery入门简介
    oracle基础琐碎总结删除数据
    WindowsPhone基础琐碎总结数据绑定(一)
    ADO.NET基础琐碎总结参数化查询
    oracle基础琐碎总结Where和Having的区别与联系
    第一次使用 Windows Live Writer
    WindowsPhone基础琐碎总结数据绑定(二)
  • 原文地址:https://www.cnblogs.com/rookiez/p/13223788.html
Copyright © 2011-2022 走看看