主题:[原创]大家快来看呀,这棵树是怎么回事了?
arlong
[专家分:60] 发布于 2006-03-09 14:10:00
#include <stdio.h>
/*#include <dos.h>*/
typedef int Status;
typedef int ElemType;
#define FAULS 0;
#define OK 1;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTnode,*BiTree;
BiTree CreateTree(BiTree T){/*建立二叉树*/
int num;
/*BiTree base;*/
scanf("%d",&num);
if(num==0) T=NULL;
else{
T=(BiTnode*)malloc(sizeof(BiTnode));
if(!T) exit(0);;
T->data=num;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
return T;
}
void PreTraverse(BiTree Tree){/*前序遍历*/
if(Tree==NULL) return;
else
{
printf("%d->",Tree->data);
PreTraverse(Tree->lchild);
PreTraverse(Tree->rchild);
}
}
void main()
{
BiTree T,Tree;
Tree=CreateTree(T);
PreTraverse(Tree);
getch();
}
这个程序,的前序遍历,怎么不对呀,结果老是死循环.
回复列表 (共9个回复)
沙发
boxertony [专家分:23030] 发布于 2006-03-10 10:46:00
不是前序遍历有问题,而是你的二叉树的创建有问题。参数必须是二级指针才行,如下:
BiTree CreateTree(BiTree *T)
{
scanf("%d",&num);
if(num==0)
{
*T=NULL;
}
else
{
...
}
...
}
板凳
arlong [专家分:60] 发布于 2006-03-10 14:52:00
为什么要用二级指针呀?
3 楼
yrd2002 [专家分:1000] 发布于 2006-03-10 17:46:00
传值和传址的问题而已
4 楼
wuchengwei [专家分:1650] 发布于 2006-03-11 15:09:00
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef int Status;
typedef int ElemType;
#define FALSE 0;
#define OK 1;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTnode,*BiTree;
void CreateTree(BiTree &T){/*建立二叉树*/
int num;
scanf("%d",&num);
if(!num)
T=NULL;
else{
T=(BiTree)malloc(sizeof(BiTnode));
T->data=num;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
void PreTraverse(BiTree Tree){/*前序遍历*/
if(Tree){
printf("%d->",Tree->data);
PreTraverse(Tree->lchild);
PreTraverse(Tree->rchild);
}
}
void InOrderTraverse(BiTree Tree){/*中序遍历*/
if(Tree){
InOrderTraverse(Tree->lchild);
printf("%d->",Tree->data);
InOrderTraverse(Tree->rchild);
}
}
void main()
{
BiTree T = NULL;
CreateTree(T);
PreTraverse(T);
printf("\n");
InOrderTraverse(T);
getch();
}
//建树3(2(6,8(5)),7(,4(9(,5))))
//则应依次输入3 2 6 0 0 8 5 0 0 0 7 0 4 9 0 5 0 0 0建树,经两次编历后,结果正确
5 楼
wuchengwei [专家分:1650] 发布于 2006-03-11 15:35:00
你的创建函数不对
建树是通过递归函数实现的,
而递归函数中所建立的节点只有在函数调用期间(本函数体内)有效,函数调用结束后
不保留和返回主函数,所以你的递归函数只能创建一个左右孩子指针未知(危险的)的
data域值为第一次输入的num值的根节点,函数返回值是指向根节点的指针
6 楼
arlong [专家分:60] 发布于 2006-03-11 15:43:00
4楼,你的那个程序还是不对吧,你用的是什么编译器?我用的是TC,怎么它老是讲
void CreateTree(BiTree &T){/*建立二叉树*/
这句,说明语法错误,但是我把它改为:void CreateTree(BiTree *T){/*建立二叉树*/
时,后面的:
T->data=num;
CreateTree(T->lchild);
CreateTree(T->rchild);
都错了,讲什么:
"错误 noname.c 22: 指针必需在 -> 的左侧在 CreateTree 函数中"
"错误 noname.c 23: 指针必需在 -> 的左侧在 CreateTree 函数中"
"错误 noname.c 24: 指针必需在 -> 的左侧在 CreateTree 函数中"
7 楼
wuchengwei [专家分:1650] 发布于 2006-03-11 15:53:00
用VC
TC不支持引用类型
8 楼
wuchengwei [专家分:1650] 发布于 2006-03-11 16:18:00
以下程序在WIN-TC下编译运行正确
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTnode,*BiTree;
void CreateT(BiTree *T){/*建立二叉树*/
int num;
scanf("%d",&num);
if(!num)
*T=NULL;
else{
*T=(BiTree)malloc(sizeof(BiTnode));
(*T)->data=num;
CreateT(&(*T)->lchild);
CreateT(&(*T)->rchild);
}
}
void PreTraverse(BiTree T){/*前序遍历*/
if(T){
printf("%d->",T->data);
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
}
void InOrderTraverse(BiTree T){/*中序遍历*/
if(T){
InOrderTraverse(T->lchild);
printf("%d->",T->data);
InOrderTraverse(T->rchild);
}
}
void main()
{
BiTree *T = (BiTree *)malloc(sizeof(BiTree));
CreateT(T);
PreTraverse(*T);
printf("\n");
InOrderTraverse(*T);
getch();
}
9 楼
八号书生 [专家分:0] 发布于 2006-11-10 17:58:00
你好,我把你写的程序在win-tc下运行时,无法停止输入,是怎么回事啊?该怎么改写程序呢?
我来回复