首页 > 其他 > 详细

剑指Offer07 重建二叉树

时间:2020-07-02 13:33:32      阅读:48      评论:0      收藏:0      [点我收藏+]

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

 

例如,给出

前序遍历 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 };

 

剑指Offer07 重建二叉树

原文:https://www.cnblogs.com/rookiez/p/13223788.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!