关于数据结构中递归建立二叉树时出现了问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于数据结构中递归建立二叉树时出现了问题相关的知识,希望对你有一定的参考价值。

我自己写了一个二叉树的基本操作的程序,但是在用递归方法建立二叉树时出现了问题,就是建立二叉树时一直在不停的输入,不能跳出输入,我看了其他很多的建立二叉树的程序,算法都是那样的,为什么跳不出去呢?请大家帮我看看,源程序如下:
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn
TElemType data;
struct Btn *lchild , *rchild;
BTN ,*BT;

BT CreateBT()
BT T;
char ch;
printf("请输入元素:");
ch=getchar();
getchar();
if((ch==' '))
T=NULL;
else

if(!(T=(BTN *)malloc(sizeof(BTN))))exit(0);
(T)->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);

return T;


void PreOrderT(BT T )

if(T)

printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;



void InOrderT(BT T)

if(T)

PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;



void PostOrderT(BT T)

if(T)

PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);



BT LocateElem(BT T , TElemType e)

BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else

p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);



int BTnum(BT T)

if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));


int BTdepth(BT T)

int h,lh,rh;
if(T==NULL)h=0;
else

lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;

return h;


void main()

BT T;
int a=0;
int flag=1;
char ch;
while(flag)

int i,j;
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)

case 1: T=CreateBT();
case 2: PreOrderT(T);
case 3: InOrderT(T);
case 4: PostOrderT(T) ;
case 5: printf("请输入你要查找的元素:");scanf("%c",&ch);LocateElem(T,ch);
case 6: BTnum(T);
case 7: BTdepth(T);
case 8: printf("程序退出:");exit(0);

printf("是否继续操作?是请输入1,否请输入2:");
scanf("%c",&a);
if(a==1)flag=1;
else flag=0;


还是不行呢,它要不断地输入,不断的输入,这个语句怎么才能跳出来呢?

#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct Btn
TElemType data;
struct Btn *lchild , *rchild;
BTN ,*BT;
//已经跟你说过了,不能返回局部指针!而且你的原程序中CreateBT函数的参数和调用时不一致!
void CreateBT(BT &T)//为了方便,这里我用了引用类型

char ch;
ch=getchar();
if(ch!='/') //当输入"/"则表示数据域为空不执行,否则执行
T=(BT)malloc(sizeof(BTN));//为结点分配空间
if(T)
T->data=ch;
CreateBT(T->lchild);
CreateBT(T->rchild);
else
printf("分配空间失败!");
exit(0);

else
T=NULL;//将T置为空



void PreOrderT(BT T )

if(T)

printf("%c",T->data);
PreOrderT(T->lchild);
PreOrderT(T->rchild) ;



void InOrderT(BT T)

if(T)

PreOrderT(T->lchild);
printf("%c",T->data);
PreOrderT(T->rchild) ;



void PostOrderT(BT T)

if(T)

PreOrderT(T->lchild);
PreOrderT(T->rchild) ;
printf("%c",T->data);



BT LocateElem(BT T , TElemType e)

BT p;
if(T==NULL)
return NULL;
else
if(T->data==e)return T;
else

p=LocateElem(T->lchild,e);
if(p) return p;
else return LocateElem(T->rchild,e);



int BTnum(BT T)

if(T==NULL)return 0;
else return(BTnum(T->lchild)+BTnum(T->rchild));


int BTdepth(BT T)

int h,lh,rh;
if(T==NULL)h=0;
else

lh=BTdepth(T->lchild);
rh=BTdepth(T->rchild);
if(lh>=rh)h=lh+1;
else h=rh+1;

return h;


void main()

BT T;
int i,flag=1;
char ch;
do
printf("请输入你想要执行的操作:\n");
printf("****** 1 按前序遍历创建一个二叉树\n");
printf("****** 2 前序遍历二叉树\n");
printf("****** 3 中序遍历二叉树\n");
printf("****** 4 后续遍历二叉树\n");
printf("****** 5 查找元e\n");
printf("****** 6 统计结点\n");
printf("****** 7 计算深度\n");
printf("****** 8 退出程序\n");
scanf("%d",&i);
getchar();
switch(i)

case 1: printf("请输入元素:");
CreateBT(T);
break;//case之后要用break跳出循环,有点粗心了!下面都是
case 2: PreOrderT(T);break;
case 3: InOrderT(T);break;
case 4: PostOrderT(T);break;
case 5: printf("请输入你要查找的元素:");
scanf("%c",&ch);
LocateElem(T,ch);
break;
case 6: BTnum(T);break;
case 7: BTdepth(T);break;
case 8: printf("程序退出:");
exit(0);

printf("是否继续操作?(y/n):");
scanf("%c",&ch);//这里的变量应该是字符类型,你的原程序中用的是整型!
getchar();
while(ch!='y');

二叉树创建函数我已经验证了,没什么问题,其它的函数都没动。
参考技术A CreateBT(T->lchild);
CreateBT(T->rchild);
这两句应该是
T->lchild=CreateBT();
T->rchild=CreateBT();
这样吧

最后多输入几个空格试试看?就输入部分来看,应该没有很大的问题

使用递归法建立二叉树

相关代码:

include

using namespace std;
typedef struct node//创建节点结构
{
char data;//数据元素
struct node Lchild;//指向左孩子结点
struct node
Rchild;//指向右孩子结点
}BinNode,*BinTree;
void CreateTree(BinTree &T);//递归法建立二叉树
void PreOrder(BinTree &T);//先序遍历
void InOrder(BinTree &T);//中序遍历
void PostOrder(BinTree &T);//后序遍历

int main()
{
BinTree T;
cout<<"请输入二叉树节点:";
CreateTree(T);
cout<<"先序遍历:";
PreOrder(T);
cout<<endl;
cout<<"中序遍历:";
InOrder(T);
cout<<endl;
cout<<"后序遍历:";
PostOrder(T);
cout<<endl;
return 0;
}

void CreateTree(BinTree &T)//创建二叉树
{
char str;
cin>>str;
if(str==‘0‘)//当输入0时,表示递归结束
T=NULL;
else
{
T=new BinNode;
T->data=str;
CreateTree(T->Lchild);//建立左子树
CreateTree(T->Rchild);//建立右子树
}
}

void PreOrder(BinTree &T)//先序遍历
{
if(T!=NULL)
{
cout<<T -> data;//输出根节点
PreOrder(T -> Lchild);//先序遍历左子树
PreOrder(T -> Rchild);//先序遍历右子树
}
}

void InOrder(BinTree &T)//中序遍历
{
if(T!=NULL)
{
InOrder(T -> Lchild);//中序遍历左子树
cout<<T -> data;//输出根节点
InOrder(T -> Rchild);//中序遍历右子树
}
}

void PostOrder(BinTree &T)//后序遍历
{
if(T!=NULL)
{
PostOrder(T -> Lchild);//后序遍历左子树
PostOrder(T -> Rchild);//后续遍历右子树
cout<<T -> data;//输出根节点
}
}

截图:
技术图片

以上是关于关于数据结构中递归建立二叉树时出现了问题的主要内容,如果未能解决你的问题,请参考以下文章

找一个Java程序:关于二叉树的建立和排序

题目 6 建立二叉树,层序、先序遍历(用非递归的方法)

使用递归法建立二叉树

建立二叉树,层序、先序遍历

C语言数据结构,急求在线二叉树先序中序后序递归遍历

python--使用递归的方式建立二叉树