重建二叉树

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 {
12 public:
13     TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin)
14     {
15         int pS = 0,iS = 0;
16         int pE = pre.size();
17         int iE = vin.size();
18         return find(pre,vin,pS,pE,iS,iE);
19     }
20     TreeNode* find(vector<int> pre,vector<int> vin,int pS,int pE,int iS,int iE)
21     {
22         //getchar();
23         TreeNode *root = new TreeNode(0);
24         int pos = -1;
25         if(pS == pE || iS == iE)
26         {
27             return NULL;
28         }
29         //cout << pre[0]<< endl;
30         for(int i = iS; i < iE; i++)
31         {
32             if(vin[i] == pre[pS])
33             {
34                 pos = i;
35                 break;
36             }
37         }
38         if(pos == -1)
39             return NULL;
40         root->val = pre[pS];
41         int offset = pos - iS;
42         root->left = find(pre,vin,pS + 1,pS + offset + 1,iS,pos);
43         root->right = find(pre,vin,pS + offset + 1,pE,pos + 1,iE);
44         return root;
45     }
46 };

 

posted @ 2018-03-16 20:31  康小武  阅读(166)  评论(0编辑  收藏  举报