【剑指offer】重建二叉树

题目链接:重建二叉树

 

题意根据前序和中序建二叉树

 

题解:数据结构里大家做前序中序建二叉树的题应该很熟了。这个题就是将思考过程用代码模拟一遍。

前序数组的第一个节点pre[0]就是根节点 ,在中序数组中找到这个根节点,以此划分左子树和右子树。

递归遍历到叶节点即可。

 

代码:

 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         int len = pre.size();
14         if(len == 0)    return NULL;
15         
16         vector<int> left_pre,right_pre,left_vin,right_vin;
17         TreeNode* tree = new TreeNode(pre[0]);
18         int root = 0;
19         for(int i = 0; i < len; i++){
20             if(pre[0] == vin[i]){//根结点在中序中的位置
21                 root = i;
22                 break;
23             }
24         }
25         //左子树
26         for(int i = 0 ;i < root ;i++){
27             left_pre.push_back(pre[i+1]);
28             left_vin.push_back(vin[i]);
29         }
30         //右子树
31         for(int i = root+1; i < len ;i++){
32             right_pre.push_back(pre[i]);
33             right_vin.push_back(vin[i]);
34         }
35         //递归遍历
36         tree->left=reConstructBinaryTree(left_pre,left_vin);
37         tree->right=reConstructBinaryTree(right_pre,right_vin);
38         return tree;
39     }
40 };

 

posted @ 2020-03-02 21:54  甜酒果。  阅读(152)  评论(0编辑  收藏  举报