一、思路
先中序序列递归建树:
依据二叉树的性质:后续序列(或子序列)的末尾元素即该二叉树(或子树)的根, 且该元素在中序序列中的左侧元素在其左子树上,右侧元素在其右子树上
void create( node *&T, int l1, int r1, int l2, int r2 )
{
if( l1 <= r1 )
{
T = (node *)malloc( sizeof(node) );
T->data = post[r1];
T->lchild = T->rchild = NULL;
int m;
for( m = 0; l2 + m <= r2 && in[l2 + m] != T->data; ++m );
create( T->lchild, l1, l1 + m - 1, l2, l2 + m - 1 );
create( T->rchild, l1 + m, r1 - 1, l2 + m + 1, r2 );
}
}
层序遍历(基于队列)输出:
queue<node*> q;
q.push(Root);
while( !q.empty() )
{
p = q.front();
q.pop();
if( p->lchild )
q.push( p->lchild );
if( p->rchild )
q.push( p->rchild );
printf("%d%s", p->data, q.empty() ? "":" ");
}
二、代码
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <queue>
using namespace std;
typedef struct node
{
int data;
struct node *lchild, *rchild;
}node;
int N;
vector<int> in(30), post(30);
void create( node *&T, int l1, int r1, int l2, int r2 )
{
if( l1 <= r1 )
{
T = (node *)malloc( sizeof(node) );
T->data = post[r1];
T->lchild = T->rchild = NULL;
int m;
for( m = 0; l2 + m <= r2 && in[l2 + m] != T->data; ++m );
create( T->lchild, l1, l1 + m - 1, l2, l2 + m - 1 );
create( T->rchild, l1 + m, r1 - 1, l2 + m + 1, r2 );
}
}
int main()
{
int N;
scanf("%d", &N);
node *Root, *p;
for( int i = 0; i < N; ++i )
scanf("%d", &post[i]);
for( int i = 0; i < N; ++i )
scanf("%d", &in[i]);
create( Root, 0, N - 1, 0, N - 1 );
queue<node*> q;
q.push(Root);
while( !q.empty() )
{
p = q.front();
q.pop();
if( p->lchild )
q.push( p->lchild );
if( p->rchild )
q.push( p->rchild );
printf("%d%s", p->data, q.empty() ? "":" ");
}
}
版权声明:本文为qq_43749739原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。