错误代码:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define NO 0
#define ERROR 0
#define YES 1
/*定义二叉树结构体*/
typedef struct Node
{
char data;
struct Node* LChild;
struct Node* RChlid;
}BiNode,*BiTree;
/*创建二叉树*/
/*用递归法创二叉树*/
void CreatBiTree(BiNode* T)
{
char ch;
ch=getchar();
if(ch==' ')
T=NULL;
else
{
T=(BiNode* )malloc(sizeof(BiNode));
if(T==NULL)
exit(0);
T->data=ch;
CreatBiTree(T->LChild);
CreatBiTree(T->RChlid);
}
}
//用先序的方法遍历二叉树
void OnBiTree(BiNode* T)
{
if(T)
{
printf("%c",T->data);
OnBiTree(T->LChild);
OnBiTree(T->RChlid);
}
}
//中序的方法遍历二叉树
void InBiTree(BiNode* T)
{
if(T)
{
InBiTree(T->LChild);
printf("%c ",T->data);
InBiTree(T->RChlid);
}
}
//后序的方法遍历二叉树
void UnderBiTree(BiNode* T)
{
if(T)
{
UnderBiTree(T->RChlid);
UnderBiTree(T->LChild);
printf("%c ",T->data);
}
}
int main()
{
BiNode T;
printf("二叉树的初始化:");
CreatBiTree(&T);
printf("前序遍历结果:");
OnBiTree(&T);
printf("中序遍历结果:");
InBiTree(&T);
printf("后序遍历结果:");
UnderBiTree(&T);
return 0;
}
在C语言中,函数参数是按值传递的,
所以当你将BiNode* T传递给CreatBiTree函数时,
实际上是传递了一个副本,而不是指向原始变量的指针。
因此,对T的任何更改都不会影响原始变量。
要解决这个问题,你可以将CreatBiTree函数修改为返回BiNode*类型的指针,
以便在函数内部分配内存并返回指向新节点的指针。
以下是正确代码:
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define NO 0
#define ERROR 0
#define YES 1
/*定义二叉树结构体*/
typedef struct Node
{
char data;
struct Node* LChild;
struct Node* RChild;
} BiNode, *BiTree;
/*创建二叉树*/
/*用递归法创建二叉树*/
BiNode* CreatBiTree()
{
char ch;
ch = getchar();
if(ch == ' ')
return NULL;
else
{
BiNode* T = (BiNode*)malloc(sizeof(BiNode));
if(T == NULL)
exit(0);
T->data = ch;
T->LChild = CreatBiTree();
T->RChild = CreatBiTree();
return T;
}
}
//用先序的方法遍历二叉树
void OnBiTree(BiNode* T)
{
if(T)
{
printf("%c", T->data);
OnBiTree(T->LChild);
OnBiTree(T->RChild);
}
}
//中序的方法遍历二叉树
void InBiTree(BiNode* T)
{
if(T)
{
InBiTree(T->LChild);
printf("%c ", T->data);
InBiTree(T->RChild);
}
}
//后序的方法遍历二叉树
void UnderBiTree(BiNode* T)
{
if(T)
{
UnderBiTree(T->LChild);
UnderBiTree(T->RChild);
printf("%c ", T->data);
}
}
int main()
{
BiNode* T = NULL;
printf("二叉树的初始化:");
T = CreatBiTree();
printf("前序遍历结果:");
OnBiTree(T);
printf("\n中序遍历结果:");
InBiTree(T);
printf("\n后序遍历结果:");
UnderBiTree(T);
return 0;
}
改动的地方:
修改前:
修改后
第二 就是把函数的名称,前边就是把无返回的改成结构体指针型的了
修改前:
修改后: