最近用到数据结构,之前也没学过,跑到图书馆看了几个版本的书,但是都记不住,总感觉少了点什么,直到自己动手的时候才发现....完了,真的是啥也不会
于是到B站自己刷视频,边看边操作,同时也看了很多博主的文章,做了一点总结,熬了俩星期,终于学会了点皮毛(个人脑子不是很好使),自己把过程也记录下来,方便以后用到
话不多说直接上代码
#include <stdio.h>
#include <stdlib.h>
bool flag = true; //有些编译器不认bool,需要改成 _Bool
#define true 1 //我也说不清楚,有些编译器不能直接用true和false,所以提前定义一下
#define false 0
typedef struct node
{
int data; //定义数据域
struct node *lchild,*rchild; //左、右子节点
} bitree; //初学数据结构,才知道这叫取别名
//结构体初始化
void init(bitree *bt)
{
bt=(bitree *)malloc(sizeof(bitree *));
bt->lchild=NULL;
bt->rchild=NULL;
}
//建立二叉树
bitree *creat()
{
bitree *bt;
int x;
scanf("%d",&x);
if(x==0) //以输入0为结束字符
bt=NULL;
else
{
bt=(bitree *)malloc(sizeof(bitree)); //生成动态节点
bt->data = x;
bt->lchild = creat(); //递归法(不懂的小伙伴可自行查找何为递归)创建左、右子节点(个人习惯这么叫)
bt->rchild = creat();
}
return bt;
}
//先序遍历二叉树
void preorder(bitree *bt)
{
if(bt!=NULL)
{
printf(" %d",bt->data);
preorder(bt->lchild); //同样是递归法进行遍历,下面也是,不多赘述
preorder(bt->rchild);
}
}
//中序遍历二叉树
void inorder(bitree *bt)
{
if(bt!=NULL)
{
inorder(bt->lchild);
printf(" %d",bt->data);
inorder(bt->rchild);
}
}
//后序遍历二叉树
void postorder(bitree *bt)
{
if(bt!=NULL)
{
postorder(bt->lchild);
postorder(bt->rchild);
printf(" %d",bt->data);
}
}
/*层次法遍历二叉树*/
bool levorder(bitree *bt)
{
if (bt == NULL)
{
return false;
}
if (bt != NULL && flag == true) //只进行一次遍历,否则会重复输出
{
printf(" %d", bt->data);
flag = false;
}
if (bt->lchild != NULL)
{
printf(" %d", bt->lchild->data);
}
if (bt->rchild != NULL)
{
printf(" %d", bt->rchild->data);
}
levorder(bt->lchild);
levorder(bt->rchild);
return true;
}
//主函数
int main()
{
bitree *root;
init(root);
root=creat();
printf("\n先序遍历的结果:");
preorder(root);
printf("\n中序遍历的结果:");
inorder(root);
printf("\n后序遍历的结果:");
postorder(root);
printf("\n层次遍历的结果:");
levorder(root);
printf("\n");
return 0;
}
大学里面二叉树基本上也就用这些,重点大学我就不好说了