前言
提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。
提示:以下是本篇文章正文内容,下面案例可供参考
一、二叉树基本操作的实现
二叉树的顺序存储结构
1.申请一块(足够大)的连续存储空间
2.若不是完全二叉树则转化为完全二叉树
3.按上到下,从左到右的顺序编号
4.按编号依次存储在连续空间中,若节点为空,则用特殊符号表示
缺点:对非完全二叉树浪费空间
二叉树的遍历:由于树的定义都是递归定义的,遍历算法也是递归的,三中基本算法的
遍历算法如下:
⑴先上后下按层次遍历
⑵先左(子树)后右(子树)的遍历
⑶先右(子树)后左(子树)的遍历
二叉树链式存储:如下图所示
如上图
原输入:AB#CD###E#FGH##K###
①先序序列:ABCDEFGHK (一次经过访问)
②中序序列:BDCAEHGKF (二次经过访问)
③后序序列:DCBHKGFEA (三次经过访问)
二、使用步骤
1.二叉树基本功能
如下(示例):
void pred_inorder(treepnode t);//先序遍历
void hou_inorder(treepnode t);//中序遍历
void zhong_inorder(treepnode t);//后序遍历
void travel(char const *str ,void (*pfun)(treepnode),treepnode t);//遍历函数
2.读入数据
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>//bool
typedef char databyte;
typedef struct treenode
{
databyte data;
struct treenode *lchild;
struct treenode *rchild;
}treenode,*treepnode;
void pred_inorder(treepnode t);
void hou_inorder(treepnode t);
void zhong_inorder(treepnode t);
void travel(char const *str ,void (*pfun)(treepnode),treepnode t);
/*treepnode creattree1(void)//创建二叉树的另一种方法(易理解)
{
databyte ch;
treepnode new;
scanf("%c",&ch);
if('#' == ch)
{
return NULL;
}
else
{
new = (treepnode)malloc(treenode);
if(new == NULL)
{
perror("malloc");
exit(1);
}
}
new->data = ch;
new->lchild= creattree();
new->rchild =creattree();
}*/
void zhong_inorder(treepnode t)//先创建子树(左),遍历完后再输出根节点,继续创建子树(右)
{
if(t != NULL)
{
zhong_inorder(t->lchild);
printf("%c",t->data);
zhong_inorder(t->rchild);
}
}
void hou_inorder(treepnode t)//创建子树遍历子树内数值,最后再把原始数值(根节点)输出
{
if(t != NULL)
{
hou_inorder(t->lchild);
hou_inorder(t->rchild);
printf("%c",t->data);
}
}
void pred_inorder(treepnode t)//先序:先输出根节点,再继续创建子树遍历左右子数内数值
{
if(t != NULL)
{
printf("%c",t->data);
pred_inorder(t->lchild);
pred_inorder(t->rchild);
}
}
void creattree2(treepnode *t)
{
databyte ch;
scanf("%c",&ch);
if('#'== ch)//如果输入为#,不会创建空间
{
*t = NULL;
}
else
{
*t = (treepnode)malloc(sizeof(treenode));//为treepnode分配空间
if(*t == NULL ){
perror("malloc:");
exit(1);
}
(*t)->data = ch;
creattree2(&(*t)->lchild);
creattree2(&(*t)->rchild);
}
}
void travel(char const *str ,void (*pfun)(treepnode) , treepnode t)
{
printf("%s",str);
pfun(t);//调用传参函数
putchar('\n');
}
int main(void)
{
treepnode t;
creattree2(&t);//创建初始化二叉树
travel("xian xu:" ,pred_inorder ,t);
travel("xian xu:" ,zhong_inorder,t);
travel("xian xu:" ,hou_inorder,t);
return 0;
}
总结
提示:本篇主要是对二叉树算法实现的代码实现,较难理解的应该是初始化二叉树那段二级指针的指向,弄清楚后先后中遍历的代码就只是递归算法的问题了。
数值输入时切记要是个可画出的二叉树,输入的数值不符合二叉树规则的话,一般不会正常输出。
希望能对你理解二叉树带来一定的帮助