用先序构造一棵二叉树,并以三种遍历方式遍历。程序求改, 最好能请指出具体错误并改正。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用先序构造一棵二叉树,并以三种遍历方式遍历。程序求改, 最好能请指出具体错误并改正。相关的知识,希望对你有一定的参考价值。
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int TElemType;
typedef int Status;
typedef struct BiTNode//注意采用的是二叉链表作为二叉树的存储结构
TElemType data;
struct BiTNode *lchild,*rchild;
BiTNode, *BiTree;
Status CreateBiTree_PreOrder(BiTree &T) //先序次序构造二叉树
TElemType ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch;
CreateBiTree_PreOrder(T->lchild);
CreateBiTree_PreOrder(T->rchild);
return OK;
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e))//先序遍历
if(T)
if((*Visit)(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
return OK;
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e)) //中序遍历
if(T!=NULL)
if(InOrderTraverse(T->lchild,Visit))
if((*Visit)(T->data))
if(InOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
else return OK;
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) //后序遍历
if(T!=NULL)
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if((*Visit)(T->data))
return OK;
return ERROR;
else return OK;
Status Disp_zhong(BiTree root)//中序输出
if(root!=NULL)
Disp_zhong(root->lchild);
printf("%d->",root->date);
Disp_zhong(root->rchild);
Status Disp_hou(BiTree root)//后序输出
if(root!=NULL)
Disp_hou(root->lchild);
Disp_hou(root->rchild);
printf("%d->",root->date);
Status Disp_xian(BiTree root)//先序输出
if(root!=NULL)
printf("%d->",root->date);
Disp_xian(root->lchild);
Disp_xian(root->rchild);
void main()//主函数
BiTree T;
printf("以先序次序创建二叉树:\n");
CreateBiTree_PreOrder(T);
printf("先序遍历序列为:\n");
PreOrderTraverse(T,Disp_xian);
printf("\n");
printf("中序遍历序列为:\n");
PreOrderTraverse(T,Disp_zhong);
printf("\n");
printf("后序遍历序列为:\n");
PreOrderTraverse(T,Disp_hou);
printf("\n");
2、本身具备遍历功能,例如:Disp_xian直接调用就行
3、要想使用PreOrderTraverse函数,必须增加打印输出函数才能满足第二个参数是函数指针类型
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef char TElemType;//字符录入
typedef int Status;
typedef struct BiTNode//注意采用的是二叉链表作为二叉树的存储结构
TElemType data;
struct BiTNode *lchild,*rchild;
BiTNode, *BiTree;
Status CreateBiTree_PreOrder(BiTree &T) //先序次序构造二叉树
TElemType ch;
scanf("%c",&ch);
if(ch==' ') T=NULL;
else
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch;
CreateBiTree_PreOrder(T->lchild);
CreateBiTree_PreOrder(T->rchild);
return OK;
Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType e))//先序遍历
if(T)
if((*Visit)(T->data))
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
return OK;
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType e)) //中序遍历
if(T!=NULL)
if(InOrderTraverse(T->lchild,Visit))
if((*Visit)(T->data))
if(InOrderTraverse(T->rchild,Visit))
return OK;
return ERROR;
else return OK;
Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType e)) //后序遍历
if(T!=NULL)
if(PostOrderTraverse(T->lchild,Visit))
if(PostOrderTraverse(T->rchild,Visit))
if((*Visit)(T->data))
return OK;
return ERROR;
else return OK;
void Disp_zhong(BiTree root)//中序输出
if(root!=NULL)
Disp_zhong(root->lchild);
printf("%c->",root->data);//是data,不是date
Disp_zhong(root->rchild);
void Disp_hou(BiTree root)//后序输出
if(root!=NULL)
Disp_hou(root->lchild);
Disp_hou(root->rchild);
printf("%c->",root->data);
void Disp_xian(BiTree root)//先序输出
if(root!=NULL)
printf("%c->",root->data);
Disp_xian(root->lchild);
Disp_xian(root->rchild);
//输出序列
Status PrintTree(TElemType e)
if(e!=' ')
printf("%c ",e);
return OK;
else
return ERROR;
void main()//主函数
BiTree T;
printf("以先序次序创建二叉树:\n");
CreateBiTree_PreOrder(T);
printf("先序遍历序列为:\n");
PreOrderTraverse(T,PrintTree);
printf("\n");
printf("中序遍历序列为:\n");
InOrderTraverse(T,PrintTree);
printf("\n");
printf("后序遍历序列为:\n");
PostOrderTraverse(T,PrintTree);
printf("\n");
追问
你的虽然还有点错,但是已经改好了,但是运行时提示内存不能为written
改的地方在这里
Status CreateBiTree_PreOrder(BiTree T) //先序次序构造二叉树
你看看是不是你录入数据格式不对
abd空格空格空格c空格空格回车,你按这个顺序录入,只有最后一个是回车
我这里正常
以先序次序创建二叉树:
abd c
先序遍历序列为:
a b d c
中序遍历序列为:
d b a c
后序遍历序列为:
d b c a
Press any key to continue
还是不行啊
追答把你录入的数据显示下,报错信息提供下
追问按照你给的那个输的
追答-_-! 如果都用我提供的代码运行,没找出内存报错信息。怪异呀,不过要是会用debug,跟踪一下就能看出毛病出在哪里了。
参考技术A 第一、你这程序太多的错误:所有的date都改为data
或者把结构体里的data改为date
第二:你输入的元素都是字符型,这个TElemType怎么可以定义为int呢,给为char
第三:我找不到你的*Visit;所以无法改为正确的输入
你检查一下你的程序是否有visit这个吧 参考技术B 0是初始节点数
输入时请一次性输完ABCффDEфGффFффф在按ENTER键 不要输入一个按一下
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define Max 20 //结点的最大个数
typedef struct node
char data;
struct node *lchild,*rchild;
BinTNode; //自定义二叉树的结点类型
typedef BinTNode *BinTree; //定义二叉树的指针
int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数
//==========基于先序遍历算法创建二叉树==============
//=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置==========
BinTree CreatBinTree(void)
BinTree T;
char ch;
if((ch=getchar())==' ')
return(NULL); //读入#,返回空指针
else
T=(BinTNode *)malloc(sizeof(BinTNode));//生成结点
T->data=ch;
T->lchild=CreatBinTree(); //构造左子树
T->rchild=CreatBinTree(); //构造右子树
return(T);
//========NLR 先序遍历=============
void Preorder(BinTree T)
if(T)
printf("%c",T->data); //访问结点
Preorder(T->lchild); //先序遍历左子树
Preorder(T->rchild); //先序遍历右子树
//========LNR 中序遍历===============
void Inorder(BinTree T)
if(T)
Inorder(T->lchild); //中序遍历左子树
printf("%c",T->data); //访问结点
Inorder(T->rchild); //中序遍历右子树
//==========LRN 后序遍历============
void Postorder(BinTree T)
if(T)
Postorder(T->lchild); //后序遍历左子树
Postorder(T->rchild); //后序遍历右子树
printf("%c",T->data); //访问结点
//=====采用后序遍历求二叉树的深度、结点数及叶子数的递归算法========
int TreeDepth(BinTree T)
int hl,hr,max;
if(T)
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr? hl:hr; //取左右深度的最大值
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。
return(max+1);
else return(0);
//====利用"先进先出"(FIFO)队列,按层次遍历二叉树==========
void Levelorder(BinTree T)
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear)
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //出队,输出结点的值
if(p->lchild!=NULL)
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
if(p->rchild!=NULL)
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
//==========主函数=================
void main()
BinTree root;
int i,depth;
printf("NodeNum:%d\n",NodeNum);
printf("Creat Bin_Tree; Input preorder:"); //输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(); //创建二叉树,返回根结点
do //从菜单中选择遍历方式,输入序号。
printf("\t********** select ************\n");
printf("\t1: Preorder Traversal\n");
printf("\t2: Iorder Traversal\n");
printf("\t3: Postorder traversal\n");
printf("\t4: PostTreeDepth,Node number,Leaf number\n");
printf("\t5: Level Depth\n"); //先判断节点数是否已有。不用再先选择4,求出该树的结点数。
printf("\t0: Exit\n");
printf("\t*******************************\n");
scanf("%d",&i); //输入菜单序号(0-5)
switch (i)
case 1: printf("Print Bin_tree Preorder: ");
Preorder(root); //先序遍历
break;
case 2: printf("Print Bin_Tree Inorder: ");
Inorder(root); //中序遍历
break;
case 3: printf("Print Bin_Tree Postorder: ");
Postorder(root); //后序遍历
break;
case 4: depth=TreeDepth(root); //求树的深度及叶子数
printf("BinTree Depth=%d BinTree Node number=%d",depth,NodeNum);
printf(" BinTree Leaf number=%d",leaf);
break;
case 5:
if(!NodeNum)
TreeDepth(root);
printf("LevePrint Bin_Tree: ");
Levelorder(root); //按层次遍历
break;
default: exit(1);
printf("\n");
while(i!=0);
参考技术C 用先序构造一棵二叉树,并以三种遍历方式遍历。程序求改, 最好能请指出具体错误并改正。
看那些誓言谎言
希望可以帮到您 参考技术D 好啊
以上是关于用先序构造一棵二叉树,并以三种遍历方式遍历。程序求改, 最好能请指出具体错误并改正。的主要内容,如果未能解决你的问题,请参考以下文章
构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果