69,371
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
const int SIZE = 1002;
int preOrder[SIZE], inOrder[SIZE];
struct Node
{
int data;
Node *lson;
Node *rson;
};
void CreatTree(Node *&tree, int preNo, int inNo, int len);
void PrintPostOrder(Node *&tree);
int main()
{
int n, i;
Node *root;
while(cin >> n)
{
for(i=0;i<n;i++)
scanf("%d", &preOrder[i]);
for(i=0;i<n;i++)
scanf("%d", &inOrder[i]);
CreatTree(root, 0, 0, n);
PrintPostOrder(root);
printf("\n");
}
return 0;
}
void CreatTree(Node *&tree, int preNo, int inNo, int len)
{
int i;
if(len <= 0)
{
tree = NULL;
return;
}
tree = new Node;
tree->data = preOrder[preNo];
for(i=0;i<len;i++)
if(preOrder[preNo] == inOrder[inNo+i])
break;
CreatTree(tree->lson, preNo+1, inNo, i);
CreatTree(tree->rson, preNo+i+1, inNo+i+1, len-i-1);
}
void PrintPostOrder(Node *&tree)
{
if(NULL == tree)
return;
PrintPostOrder(tree->lson);
PrintPostOrder(tree->rson);
printf("%d", tree->data);
if(tree->data != preOrder[0])
printf(" ");
}
/*求助:根据先序和中序遍历的结果建立一棵二叉树,编译调试都通过了,但不能正常运行,大神麻烦帮我看一下*/
#include<stdio.h>
#include<stdlib.h>
typedef int ELemType;
typedef struct BiTreeNode{
ELemType data;
struct BiTreeNode* lchild;
struct BiTreeNode* rchild;
} BiTreeNode, *BiTree;
void CreateTree(ELemType preord[],ELemType inord[],int n,BiTree *root);
void PreInOrd(ELemType preord[],ELemType inord[],int i,int j,int k,int h,BiTree *t);
void lastOrder(BiTree head);
int main()
{
//void PreInOrd(ELemType preord[],ELemType inord[],int i,int j,int k,int h,BiTree *t);
//void CreateTree(ELemType preord[],ELemType inord[],int n,BiTree root);
BiTree R=NULL;
ELemType preorder[]={0,1,2,4,3,5,7,6,8,9}; /*先序遍历结果,0用于占位*/
ELemType inorder[]={0,4,2,1,5,7,3,8,6,9}; /*中序遍历结果,0用于占位*/
/*
1,2,4,3,5,7,6,8,9
4,2,1,5,7,3,8,6,9
1
2 3
4 5 6
7 8 9
后序遍历:
4 2 7 5 8 9 6 3 1
*/
CreateTree(preorder,inorder,9,&R);
return 0;
}
//void CreateTree(ELemType preord[],ELemType inord[],int n,BiTree root)
void CreateTree(ELemType preord[],ELemType inord[],int n,BiTree *root)
{ /*n二叉树结点数目,建立的二叉树放在root中*/
if(n<=0) {
(*root)=NULL;
}
else {
//PreInOrd(preord,inord,1,n,1,n,&root);
PreInOrd(preord,inord,1,n,1,n,root);
}
lastOrder(*root); /*后序遍历输出*/
}
void PreInOrd(ELemType preord[],ELemType inord[],int i,int j,int k,int h,BiTree *t)
{/*先序序列从i到j,中序序列从k到h,建立的二叉树放在t中*/
int m;
*t=(BiTree)malloc(sizeof(BiTreeNode));
//(*t)->data=preord; /*二叉树的根*/
(*t)->data=preord[i];
m=k;
//while(inord[m]!=preord) { /*在中序序列中定位根*/
while(m <=h&&inord[m]!=preord[i]) {
m++; //m=3,k=1 m=2,k=1
}
if(m==k) {
(*t)->lchild=NULL;
}
else {
PreInOrd(preord,inord,i+1,i+m-k,k,m-1,&((*t)->lchild));
}
if(m==h) {
(*t)->rchild=NULL;
}
else {
PreInOrd(preord,inord,i+m-k+1,j,m+1,h,&((*t)->rchild)); //这里是右子树
}
}
void lastOrder(BiTree head) /*后序遍历*/
{
if(head)
{
lastOrder(head->lchild); /*递归遍历左子树*/
lastOrder(head->rchild); /*递归遍历右子树*/
printf("%d\t",head->data);
}
}