剑指offer---重建二叉树

题目:重建二叉树

要求:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

 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 
14     }
15 };

解题代码:

 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> in) {
13         if(pre.size() != in.size() || pre.size() == 0)
14             return nullptr;
15 
16         vector<int> leftPre, rightPre;
17         vector<int> leftIn, rightIn;
18 
19         int rootValue = pre[0];
20         TreeNode* root = new TreeNode(rootValue);
21 
22         int mid;
23         for(int i=0; i<in.size(); i++){
24             if(rootValue == in[i]){
25                 mid = i;
26                 break;
27             }
28         }
29 
30         for(int i=1; i<pre.size(); i++){
31             if(i <= mid)
32                 leftPre.push_back(pre[i]);
33             else
34                 rightPre.push_back(pre[i]);
35         }
36 
37         for(int i=0; i<pre.size(); i++){
38             if(i < mid)
39                 leftIn.push_back(in[i]);
40             else if(i > mid)
41                 rightIn.push_back(in[i]);
42         }
43         root->left = reConstructBinaryTree(leftPre, leftIn);
44         root->right = reConstructBinaryTree(rightPre, rightIn);
45         return root;
46     }
47 };

 

posted on 2018-10-24 15:11  wangzhch  阅读(173)  评论(0编辑  收藏  举报

导航