您的位置:首页 > 编程语言 > C语言/C++

poj 2255:重建二叉树

2014-06-26 15:04 447 查看
解题思路:

根据二叉树的前序和中序遍历序列重建二叉树,并输出后序遍历序列。

#include<iostream>
#include<cstring>
using namespace std;

const int inf = 100;

struct node
{
char letter;
int left,right;
};
node v[30];
string preorder,inorder;

int buildTree(int x,int y) //对中序遍历区间建树
{
if(x==y)
{
v[x].letter = inorder[x];
v[x].left = -1;
v[x].right = -1;
return x;
}
int r_num = inf;
int m_num; //子树根节点标号
int i,j;
for(i=x;i<=y;i++)
{
for(j=0;j<preorder.length();j++)
if(inorder[i]==preorder[j])
break;
if(j<r_num)
{
r_num = j;
m_num = i;
}
}
//子树根节点
v[m_num].letter = inorder[m_num];
//左子树
if(m_num-1 >= x)
v[m_num].left = buildTree(x,m_num-1);
else
v[m_num].left = -1;
//右子树
if(m_num+1 <= y)
v[m_num].right = buildTree(m_num+1,y);
else
v[m_num].right = -1;
return m_num;
}

int visit[30];
void postorder(int r) //后序遍历二叉树
{
if((v[r].left==-1 || visit[r]==1) && (v[r].right ==-1 || visit[r]==1))
{
cout<<v[r].letter;
visit[r] = 1;
return;
}
if(v[r].left!=-1 && visit[r]==0)
postorder(v[r].left);
if(v[r].right!=-1 && visit[r]==0)
postorder(v[r].right);
cout<<v[r].letter;
return;
}

int main()
{
while(cin>>preorder>>inorder)
{
int root = buildTree(0,inorder.length()-1);
memset(visit,0,sizeof(visit));
postorder(root);
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ poj 二叉树 递归