您的位置:首页 > Web前端

剑指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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: