C语言二叉树创建与先序遍历代码解析 - 深入理解代码逻辑
C语言二叉树创建与先序遍历代码解析
这段代码实现了二叉树的创建和先序遍历功能,并通过详细的代码注释和讲解,帮助你深入理解二叉树的构建和遍历过程。
#include<stdio.h>
#include<stdlib.h>
typedef char elem;
typedef struct node
{
elem data;
struct node *lchild;
struct node *rchild;
}BTnode;
void preorder(BTnode *&b)
{
if(b!=NULL)
{
printf("%c",b->data);
preorder(b->lchild) ;
preorder(b->rchild) ;
}
}
void createbtree( BTnode *&b,char *str)
{
int maxsize=10;
BTnode *sto[maxsize],*p;
int top = -1,k,j=0;
b=NULL;
char ch;
ch=str[j];
while(str[j]!='\0')
{
switch(ch)
{
case '(' : top++; sto[top]=p;k=1;break;
case ',' : k=2;break;
case ')' : top--;break;
default : p=(BTnode *)malloc(sizeof(BTnode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL)
b=p;
else
{
switch(k)
{
case 1 : sto[top]->lchild=p;break;
case 2 : sto[top]->rchild=p;break;
}
}
j++;
ch=str[j];
}
}
}
int main()
{
int maxsize,i=0;
BTnode *t = NULL; // 初始化t指针
char string[] = "x(a(b(c(z,y),d),d))" ;
while(string[i]!='\0')
if(string[i]=='(')
i++;
maxsize=i;
printf("%d\n",maxsize);
createbtree(t,string);
preorder(t);
return 0;
}
代码解释:
-
数据结构定义:
BTnode结构体定义了一个二叉树节点,包含数据域data和左右子树指针lchild和rchild。
-
先序遍历函数
preorder:- 函数递归地访问二叉树,按照根节点 -> 左子树 -> 右子树的顺序输出节点数据。
-
创建二叉树函数
createbtree:- 函数通过输入一个字符串,根据字符串的结构创建二叉树。
- 字符串的格式:
x(a(b(c(z,y),d),d)),其中x是根节点,括号内的元素代表左右子树,逗号分隔左右子树的节点。 - 函数使用栈来记录节点的父节点,并根据输入字符串创建节点并链接它们,最终形成一棵二叉树。
-
主函数
main:- 初始化一个字符串
string,代表要创建的二叉树。 - 初始化一个
BTnode指针t,用来指向二叉树的根节点。 - 调用
createbtree函数创建二叉树。 - 调用
preorder函数进行先序遍历。
- 初始化一个字符串
代码中存在的错误:
- 在
main函数中,BTnode *t;只声明了t指针,但没有初始化。在调用createbtree函数时,传入的是一个未初始化的指针,会导致程序错误。
解决方案:
- 在
main函数中将BTnode *t;改为BTnode *t = NULL;,将t初始化为 NULL 指针,以避免错误。
总结:
这段代码演示了如何使用 C 语言创建二叉树并进行先序遍历,通过详细的代码注释和讲解,你可以更好地理解二叉树的基本操作。如果你对二叉树还有其他问题,请随时提问。
建议:
- 为了更好地理解代码,可以尝试将代码中的字符串替换为其他不同的二叉树结构,观察代码的运行结果。
- 可以尝试将先序遍历改为中序遍历或后序遍历,并修改代码以实现相应的遍历功能。
- 可以尝试在代码中加入调试语句,比如在
preorder函数中加入printf语句来检查程序的执行情况,帮助定位问题所在。
希望这份解析对你的学习有所帮助!
原文地址: https://www.cveoy.top/t/topic/p3NK 著作权归作者所有。请勿转载和采集!