运行没有错误但是只能输入左子树无法输入右子树
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree
{
int data; //存放数据域
struct Tree *lchild; //左子树指针
struct Tree *rchild; //右子树指针
}Tree,*BiTree;
BiTree CreateLink()
{
int data;
int temp;
BiTree T;
scanf("%d",&data); //输入数据
temp=getchar(); //吸收空格
if(data == -1){ //-1表示无子树
return NULL;
}
else{
T = (BiTree)malloc(sizeof(Tree)); //分配内存空间
T->data = data; //把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ",data);
T->lchild = CreateLink(); //开始递归创建左子树
if(data==-1){
printf("请输入%d的右子树: ",data);
T->rchild = CreateLink(); //开始到上一级节点的右边递归创建左右子树 问题是:输入左子树之后无法输入右子树 ...
if(data==-1)
return T;
}
return T; //返回根节点
}
}
void PreOrderTraverse (BiTree T) //先序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
printf("%d",T->data);
PreOrderTraverse (T->lchild); //递归遍历左子树
PreOrderTraverse (T->rchild); //递归遍历右子树
}
void InOrderTraverse (BiTree T) //中序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
InOrderTraverse (T->lchild); //递归遍历左子树
printf("%d",T->data); //访问根结点
InOrderTraverse (T->rchild); //递归遍历右子树
}
void PostOrderTraverse (BiTree T) //后序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
PostOrderTraverse (T->lchild); //递归遍历左子树
PostOrderTraverse (T->rchild); //递归遍历右子树
printf("%d",T->data);
}
int main()
{
BiTree S;
printf("第一个节点数据:\n");
S = CreateLink(); //二叉树根节点
printf("先序遍历结果: \n");
PreOrderTraverse (S); //先序遍历二叉树
printf("\n中序遍历结果: \n");
InOrderTraverse (S); //中序遍历二叉树
printf("\n后序遍历结果: \n");
PostOrderTraverse (S); //后序遍历二叉树
return 0;
}
尝试过改变结束输入左子树和右子树的条件,但是改变了之后条件用不了,无法结束左子树的输入
先输入左子树,后输入右子树,然后按三种不同方式输出
把
BiTree CreateLink()
{
int data;
int temp;
BiTree T;
scanf("%d",&data); //输入数据
temp=getchar(); //吸收空格
if(data == -1){ //-1表示无子树
return NULL;
}
else{
T = (BiTree)malloc(sizeof(Tree)); //分配内存空间
T->data = data; //把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ",data);
T->lchild = CreateLink(); //开始递归创建左子树
if(data==-1){
printf("请输入%d的右子树: ",data);
T->rchild = CreateLink(); //开始到上一级节点的右边递归创建左右子树 问题是:输入左子树之后无法输入右子树 ...
if(data==-1)
return T;
}
return T; //返回根节点
}
}
改为
BiTree CreateLink()
{
int data;
int temp;
BiTree T;
scanf("%d", &data); //输入数据
temp = getchar(); //吸收空格
if (data == -1) { //-1表示无子树
return NULL;
}
else {
T = (BiTree)malloc(sizeof(Tree)); //分配内存空间
T->data = data; //把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ", data);
T->lchild = CreateLink(); //开始递归创建左子树
printf("请输入%d的右子树: ", data);
T->rchild = CreateLink(); //开始到上一级节点的右边递归创建左右子树 问题是:输入左子树之后无法输入右子树 ...
}
return T;
}
运行结果如下
通过递归建立二叉树的,先左后右,不需要单独判断
修改如下
#include<stdio.h>
#include<stdlib.h>
typedef struct Tree
{
int data; //存放数据域
struct Tree *lchild; //左子树指针
struct Tree *rchild; //右子树指针
} Tree,*BiTree;
BiTree CreateLink()
{
int data;
int temp;
BiTree T;
scanf("%d",&data); //输入数据
temp=getchar(); //吸收空格
if(data == -1) { //-1表示无子树
return NULL;
}
else {
T = (BiTree)malloc(sizeof(Tree)); //分配内存空间
T->data = data; //把当前输入的数据存入当前节点指针的数据域中
printf("请输入%d的左子树: ",data);
T->lchild = CreateLink(); //开始递归创建左子树
printf("请输入%d的右子树: ",data);
T->rchild = CreateLink(); //开始到上一级节点的右边递归创建左右子树 问题是:输入左子树之后无法输入右子树 ...
}
return T; //返回根节点
}
void PreOrderTraverse (BiTree T) //先序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
printf("%d",T->data);
PreOrderTraverse (T->lchild); //递归遍历左子树
PreOrderTraverse (T->rchild); //递归遍历右子树
}
void InOrderTraverse (BiTree T) //中序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
InOrderTraverse (T->lchild); //递归遍历左子树
printf("%d",T->data); //访问根结点
InOrderTraverse (T->rchild); //递归遍历右子树
}
void PostOrderTraverse (BiTree T) //后序遍历二叉树
{
if(T==NULL) //递归中遇到NULL,返回上一层节点
{
return;
}
PostOrderTraverse (T->lchild); //递归遍历左子树
PostOrderTraverse (T->rchild); //递归遍历右子树
printf("%d",T->data);
}
int main()
{
BiTree S;
printf("第一个节点数据:\n");
S = CreateLink(); //二叉树根节点
printf("先序遍历结果: \n");
PreOrderTraverse (S); //先序遍历二叉树
printf("\n中序遍历结果: \n");
InOrderTraverse (S); //中序遍历二叉树
printf("\n后序遍历结果: \n");
PostOrderTraverse (S); //后序遍历二叉树
return 0;
}