中序先序遍历建立二叉树的问题,急!!

avecparapluie 2010-05-08 11:41:25
/*根据先序和中序遍历的结果建立一棵二叉树,编译调试都通过了,不能正常运行,哪位大神麻烦看一下*/
#include<stdio.h>
#include<stdlib.h>
typedef int ELemType;

typedef struct BiTreeNode{
ELemType data;
struct BiTreeNode* lchild;
struct BiTreeNode* rchild;
}BiTreeNode,*BiTree;

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用于占位*/
CreateTree(preorder,inorder,9,R);
return 0;
}

void CreateTree(ELemType preord[],ELemType inord[],int n,BiTree root){ /*n二叉树结点数目,建立的二叉树放在root中*/
void PreInOrd(ELemType preord[],ELemType inord[],int i,int j,int k,int h,BiTree *t);
void lastOrder(BiTree head);
if(n<=0) root=NULL;
else 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[i]; /*二叉树的根*/
m=k;
while(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)->lchild));
}

void lastOrder(BiTree head) /*后序遍历*/
{
if(head)
{
lastOrder(head->lchild); /*递归遍历左子树*/
lastOrder(head->rchild); /*递归遍历右子树*/
printf("%d\t",head->data);
}
}
...全文
209 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aleyn 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 aaa20090987 的回复:]
LZ参考一下这道ACM题吧,是以先序和中序构建二叉树,再以后序输出的

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1710


C/C++ code
#include <iostream>
using namespace std;

const int SIZE = 1002;
int preOrder[SIZE], inOr……
[/Quote]

支持
avecparapluie 2010-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 huanmie_09 的回复:]

接分!
[/Quote]不好意思我的分不多了,那边40分已经全都给你了。麻烦你能不能再帮我看一个哈弗曼编码问题呢?就是根据一个数组建立一棵哈夫曼树,再编码并输出编码。还是能编译调试能过,但不能运行。先谢了!!
#include<stdio.h>
#include<stdlib.h>
#define MAXVALUE 100
#define MAXBIT 10

typedef struct HNode{
int weight;
int parent,lchild,rchild;
}HNode;

typedef struct HCode{
int bit[MAXBIT];
int start;
}HCode;

void Huffman(HNode *HT,HCode *HC,int *w,int n);
void print(HNode *HT,int num);

int main(){
HNode *HT=NULL;
HCode *HC=NULL;
int a[7]={2,5,4,8,10,7,19}; /*有7个元素*/
Huffman(HT,HC,a,7);
print(HT,2*7-1);
return 0;
}

void Huffman(HNode *HT,HCode *HC,int *w,int n){ /*w存放n个字符权值,构造哈弗曼树HT*/
if(n<=1) return;
int m=2*n-1; /*哈夫曼树结点数目*/
HT=(HNode *)malloc(sizeof(HNode));
int i;
HNode *p=HT;
for(i=0;i<n;++i,++p,++w){ /*初始化叶子结点信息*/
/*HT[i].weight=*w;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;
*/
(*p).weight=*w;
(*p).lchild=-1;
(*p).rchild=-1;
(*p).parent=-1;
}
for(;i<m;++i){ /*初始化分支结点*/
(*p).weight=0;
(*p).lchild=-1;
(*p).rchild=-1;
(*p).parent=-1;
/*HT[i].weight=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].parent=0;*/
}
int m1,m2,x1,x2,j;
for(i=n;i<m;++i){ /*寻找根结点权值最小和次小的两棵子树*/
m1=m2=MAXVALUE;
x1=x2=0;
for(j=0;j<i;++j){
if((HT[j].parent==-1)&&(HT[j].weight<m1)){
m2=m1;
x2=x1;
m1=HT[j].weight;
x1=j;
}
else if((HT[j].parent==-1)&&(HT[j].weight<m2)){
m2=HT[j].weight;
x2=j;
}
}
/*合并一棵新的子树*/
HT[x1].parent=i;
HT[x2].parent=i;
HT[i].lchild=x1;
HT[i].rchild=x2;
HT[i].weight=m1+m2;
}

HC=(HCode *)malloc(n*sizeof(HCode)); /*字符编码*/
for(i=0;i<n;i++){
int c,f,start=n;
for(c=i,f=HT[i].parent;f!=-1;c=f,f=HT[f].parent)
if(HT[f].lchild=c)HC[i].bit[start--]=0;
else HC[i].bit[start--]=1;
HC[i].start=start+1; /*记录编码的起始位置*/
}
for(i=0;i<n;i++)
printf("%d编码为%s\n",HT[i].weight,HC[i]);

}
void print(HNode *HT,int m){ /*输出哈夫曼树结点权值*/
if(m){
printf("%d\t",HT[m].weight);
print(HT,HT[m].lchild);
print(HT,HT[m].rchild);
}
}
AAA20090987 2010-05-09
  • 打赏
  • 举报
回复
LZ参考一下这道ACM题吧,是以先序和中序构建二叉树,再以后序输出的

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1710

#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(" ");
}
huanmie_09 2010-05-09
  • 打赏
  • 举报
回复
接分!
mayonglong 2010-05-08
  • 打赏
  • 举报
回复
顶~~~~

33,010

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧