<数据结构>二叉树功能实现


前言

提示:本篇主要是本小白大学期间对数据结构实验的一些基本代码功能实现,希望对一同数据结构的伙伴有所帮助。


提示:以下是本篇文章正文内容,下面案例可供参考

一、二叉树基本操作的实现

二叉树的顺序存储结构
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;
}

总结

提示:本篇主要是对二叉树算法实现的代码实现,较难理解的应该是初始化二叉树那段二级指针的指向,弄清楚后先后中遍历的代码就只是递归算法的问题了。
数值输入时切记要是个可画出的二叉树,输入的数值不符合二叉树规则的话,一般不会正常输出。
希望能对你理解二叉树带来一定的帮助

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值