用递归方式建立的二叉树不能输出
我用递归建立了二叉树,但是不能输出,请大家帮忙看看,小弟分不多,请见谅。上代码:
#include<stdio.h>
#include<stdlib.h>
struct BiTNode {
char data;
struct BiTNode* lchild; //二叉树的结构
struct BiTNode* rchild;
};
typedef struct BiTNode * BiTree ;
void CreatBiTree( BiTree ); //创建二叉树
void PreOrderTraverse(BiTree ); // 遍历该二叉树,打印各个节点的值
main(){
BiTree T=NULL; //T为根节点
CreatBiTree( T ) ;
PreOrderTraverse( T ) ;
system("pause");
return 0;
}
//用先序递归过程建立二叉树
void CreatBiTree( BiTree T) {
char ch;
scanf("%c",&ch);
if( ch == '*') //如果输入星号则二叉树的节点为空节点
T=NULL;
else {
T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
if(T!=NULL){
T->data=ch;
CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树
CreatBiTree(T->rchild);
}
else{
printf("内存分配失败!");
return ;
}
}
}
void PreOrderTraverse(BiTree T){
if (T) {
printf("%c",T->data);
PreOrderTraverse(T->lchild) ; //遍历该树,输出各个节点的值
PreOrderTraverse(T->lchild) ;
}
else return;
}
我在屏幕上输入 ab**c** 却没有输出,为什么?
[解决办法]
void CreatBiTree( BiTree &T)////传递指针的引用试试 {char ch;scanf("%c",&ch);if( ch == '*') //如果输入星号则二叉树的节点为空节点T=NULL;else {T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间if(T!=NULL){T->data=ch; CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树CreatBiTree(T->rchild); }else{printf("内存分配失败!"); return ; }} }
[解决办法]
可能是创建二叉树的代码有点问题,改一下看看:
void CreatBiTree(BiTree *t)
{
char ch;
if((ch=getchar())==' ')
*t=null;
else
{
*t=(struct BiTNode *)malloc(sizeof(struct BiTNode));
(*t)->data=ch;
CreatBiTree(&(*t)->lchild);
CreatBiTree(&(*t)->rchild);
}
}
[解决办法]
void CreatBiTree( BiTree *T) {
char ch;
scanf("%c",&ch);
if(ch=='*')//如果输入星号则二叉树的节点为空节点
{
(*T) = NULL;
return;
}
else
{
*T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
if(*T!=NULL)
{
(*T)->data=ch;
CreatBiTree(&(*T)->lchild);//分配成功则继续建立左子树和右子树
CreatBiTree(&(*T)->rchild);
}
else{
printf("内存分配失败!");
return ;
}
}
}
[解决办法]
#include<stdio.h>#include<stdlib.h>struct BiTNode {char data;struct BiTNode* lchild; //二叉树的结构struct BiTNode* rchild;};typedef struct BiTNode * BiTree ; void CreatBiTree( BiTree &); //创建二叉树--------------改成按引用创建二叉树void PreOrderTraverse(BiTree ); // 遍历该二叉树,打印各个节点的值int main(){BiTree T = NULL; //T为根节点CreatBiTree( T ) ;PreOrderTraverse( T ) ;system("pause");return 0;}//用先序递归过程建立二叉树void CreatBiTree( BiTree &T) { char ch; scanf("%c",&ch); if( ch == '*') //如果输入星号则二叉树的节点为空节点 { T=NULL; return ;//缺少一个return } else { T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间 if(T!=NULL) { T->data=ch; CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树 CreatBiTree(T->rchild); } else { printf("内存分配失败!"); return ; } } } void PreOrderTraverse(BiTree T){ if (T) {printf("%c",T->data); PreOrderTraverse(T->lchild) ; //遍历该树,输出各个节点的值PreOrderTraverse(T->rchild) ;//----------这个地方有错}else{ return;}}