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;
}
根据二叉树的前序和中序遍历序列重建二叉树,并输出后序遍历序列。
#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;
}
相关文章推荐
- POJ 2255 经典的重建二叉树
- POJ2255,Tree Recovery,二叉树重建
- 重建二叉树 POJ 2255
- POJ 2255 根据二叉树的前序和中序序列来重建二叉树
- POJ 2255 Tree Recovery【二叉树重建】
- POJ 2255 Tree Recovery(二叉树重建)
- POJ 2255 Tree Recovery 二叉树恢复
- poj2255 根据任意二叉树的先序遍历和中序遍历求解后序遍历
- 二叉树的探索 poj 2255
- POJ 2255 Tree Recovery [二叉树]
- B - Tree Recovery POJ - 2255 (二叉树)
- POJ 2255 Tree Recovery ( 二叉树)
- POJ 2255/hrbust 2022 Tree Recovery【dfs、二叉树的层次遍历】
- POJ 2255 Tree Recovery 二叉树的遍历
- POJ 2255 Tree Recovery(二叉树)
- poj 2255 Tree Recovery(求后序遍历,二叉树)
- poj2255 二叉树给出先序中序求后序序列
- POJ 2255 Tree Recovery 二叉树的遍历
- poj 2255 Tree Recovery(二叉树)
- POJ 2255 Tree Recovery 二叉树基础