传送门:重建二叉树
通过给定的先序遍历与中序遍历的顺序构造出二叉树的结构。
先序遍历优先访问根节点然后访问子节点。因此可以通过先序遍历中第一个节点在中序遍历中的位置把节点分为左子树的节点以及右子树的节点。然后再对分出的区间进行同样的递归操作即可
/******************************************************
* File Name: tree.cpp
* Author: kojimai
* Create Time: Fri 10 Apr 2015 08:58:04 PM CST
******************************************************/
/*struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x): val(x),left(NULL),right(NULL){}
};*/
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
TreeNode* root = NULL;
if(pre.size() == 0 || pre.size() != in.size())
return root;
root = new TreeNode(pre[0]);
int indexOfRoot = 0;
while(in[indexOfRoot] != pre[0])
indexOfRoot++;
root->left = constructTree(pre,in,0,indexOfRoot-1,1,indexOfRoot);
cout<<"left"<<endl;
root->right = constructTree(pre,in,indexOfRoot+1,in.size()-1,indexOfRoot+1,in.size()-1);
return root;
}
TreeNode* constructTree(vector<int> &pre,vector<int> &in,int inLeft,int inRight,int preLeft,int preRight) {
cout<<"inLeft = "<<inLeft<<" inRight = "<<inRight<<" preL = "<<preLeft<<" preRight =" <<preRight<<endl;;
if(inLeft > inRight || preLeft > preRight)
return NULL;
TreeNode* root = new TreeNode(pre[preLeft]);
cout<<"val = "<<pre[preLeft]<<endl;
if(inLeft == inRight)
return root;
//cout<<"preL = "<<preLeft<<" pre = "<<pre[preLeft]<<endl;
int indexOfRoot = 0;
while(in[indexOfRoot+inLeft] != pre[preLeft])
indexOfRoot++;
//cout<<indexOfRoot<<endl;
root->left = constructTree(pre,in,inLeft,inLeft+indexOfRoot-1,preLeft+1,preLeft+indexOfRoot);
root->right = constructTree(pre,in,inLeft+indexOfRoot+1,inRight,preLeft+indexOfRoot+1,preRight);
return root;
}
};