剑指Offer之 - 重建二叉树
2015-05-02 16:23
465 查看
题目:
根据二叉树的前序和中序遍历结果,重建出二叉树(不含重复数字)思路:
参考:http://blog.csdn.net/u012243115/article/details/42143549 和 http://blog.csdn.net/u012243115/article/details/42141713 。代码:
#include<iostream>#include<vector>
#include<queue>
using namespace std;
//由前序和中序遍历结果构造二叉搜索树
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x):val(x),left(NULL),right(NULL){}
};
TreeNode *ConstructBinaryTree(vector<int> &pre , int pbeg , int pend , vector<int> &in , int ibeg , int iend)
{
if(pbeg > pend )
return NULL;
TreeNode *head = new TreeNode(pre[pbeg]);
int tmp = pre[pbeg];
int pos = ibeg;
while(pos < iend && in[pos] != tmp){
pos++;
}
int len = pos - ibeg;
head->left = ConstructBinaryTree(pre,pbeg+1,pbeg+len,in,ibeg,pos-1);
head->right= ConstructBinaryTree(pre,pbeg+len+1,pend , in , pos + 1 , iend);
return head;
}
struct TreeNode* reConstructBinaryTree(vector<int> &pre,vector<int> &in)
{
if(pre.empty() || in.empty())
return NULL;
return ConstructBinaryTree(pre , 0 , pre.size()-1 , in , 0 , in.size()-1);
}
//按层次打印二叉树结点值
void print(TreeNode *head)
{
queue<TreeNode *> q;
if(head == NULL)
return;
q.push(head);
while(!q.empty())
{
TreeNode *tmp = q.front();
cout<<tmp->val<<" ";
q.pop();
if(tmp->left)
{
q.push(tmp->left);
}
if(tmp->right)
{
q.push(tmp->right);
}
}
}
int main()
{
int pre[6] = {3,1,2,6,5,7};
int in[6] = {1,2,3,5,6,7};
vector<int> preV(pre , pre+6);
vector<int> inV(in , in+6);
TreeNode *head = reConstructBinaryTree(preV,inV);
print(head);
cout<<endl;
return 0;
}
相关文章推荐
- 【剑指offer】重建二叉树&&二叉树的递归与非递归遍历
- [牛客网,剑指offer,python] 重建二叉树
- 剑指offer:重建二叉树(java)
- 剑指offer-面试题06-重建二叉树
- 剑指offer-重建二叉树(java版)
- 剑指offer -重建二叉树
- 【剑指offer】如何通过先序遍历与中序遍历重建二叉树
- 剑指offer-重建二叉树
- 剑指offer面试题6——重建二叉树(递归)
- 剑指offer:6-重建二叉树
- 剑指offer--面试题6 重建二叉树
- [牛客网,剑指offer,python] 重建二叉树
- 剑指offer刷题之c++实现的根据二叉树的前序和中序遍历重建二叉树
- 剑指offer——题目1385:重建二叉树
- 【剑指offer Java】面试题6:重建二叉树
- 【剑指offer】面试题7:重建二叉树
- 【剑指offer】重建二叉树
- 【剑指Offer】面试题6:重建二叉树
- 【剑指offer】面试题6:重建二叉树
- 剑指Offer面试题6(Java版):重建二叉树