数据结构——树与二叉树(Code)

本文详细介绍了树和二叉树的概念,重点讨论了二叉树的顺序存储和链式存储结构,包括完全二叉树的存储方法、二叉链表的构建。此外,还深入讲解了二叉树的遍历算法,如先序、中序、后序和层次遍历,并探讨了非递归实现以及线索二叉树的创建、中序线索化和遍历方法。
摘要由CSDN通过智能技术生成

下面写的代码可能感觉会很乱,所以加上了目录,意在为了引导,也就是你需要回顾哪个算法,就能够快速定位到该位置。另外,线索二叉树只写了中序线索二叉树。

三、树和二叉树
(一)二叉树的顺序存储结构
  1. 二叉树的顺序存储结构最适用于存储完全二叉树,存储方法如下:

[外链图片转存失败(img-sbfH06TO-1565876469580)(C:\Users\DONG\AppData\Roaming\Typora\typora-user-images\1565702614604.png)]

  1. 构造完全二叉树
int data[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
(二)二叉树的链式存储结构——二叉链表存储结构
  1. 结构体的声明
typedef struct BT_NODE
{
   
	int data;							//存放结点中的数据,这里的数据类型可以改变
	struct BT_NODE* l_child;			//指向左孩子的指针
	struct BT_NODE* r_child;			//指向右孩子的指针
}BT_NODE;
(三)二叉树的遍历算法
  1. 在遍历二叉树之前,我们是不是得要有一个二叉链表?下面是构造二叉链表代码
/*
method:
	初始化一个树,用二叉链表表示,
param:
	bt_node		树
	data		这里是一个数组,数组里面的数据是按照完全二叉树的顺序存储结构存储的。
	n			是要存储的结点的个数
	pos			这里是当前结点位置,初始值为0
	此方法大致思路如下:
				1
		2				3 
	4		5		6		7
  8	 9	  10 11   12 13   14 15

  存储顺序如下:1->2->4->8->9->5->10->11->3->6->12->13->7->14->15
  即:每次先存储左孩子,直到最后左孩子的数组越界,然后返回上一层,存储右孩子
*/
int BT_Init(BT_NODE* bt_node, int* data, int n, int pos)
{
   
	BT_NODE* p, * q;
	if (n <= 0)												//如果输入的个数n小于等于0,直接返回
		return ERROR;
	if (pos == 0)											//因为递归,这个不能重复赋值,所以只在根节点也就是位置为0处,赋值
	{
   														//目的只是为了执行一次
		bt_node[0].data = data[0];							
		bt_node[0].l_child = NULL;
		bt_node[0].r_child = NULL;
		if (n == 1)											//在这里加一个判断,如果输入值为1,返回创建成功
			return OK;
	}
/************************************************************/
/*************************创建树的核心代码*******************/
/************************************************************/
	if(2 * pos + 1 >= n)									//2*pos+1 的位置是它的左孩子的值在数组中存放位置。为了防止数组越界
		return ERROR;
	p = (BT_NODE*)malloc(sizeof(BT_NODE));					//创建内存
	p->data = data[2 * pos + 1];							//获取数据
	p->l_child = NULL;
	p->r_child = NULL;
	bt_node->l_child = p;									//创建的左孩子将其当作子树的根节点,进行递归
	BT_Init(bt_node->l_child, data, n, 2 * pos + 1);		//这里是递归操作,意在每次都是先创建左子树,再创建右子树,
															//直到左子树数组越界,然后返回上一层,创建右子树

	if (2 * pos + 2 >= n)
		return ERROR;
	q = (BT_NODE*)malloc(sizeof(BT_NODE));		
	q->data = data[2 * pos + 2];							//2*pos+2 的位置是它的右孩子的值在数组中存放位置。为了防止数组越界
	q->l_child = NULL;
	q->r_child = NULL;
	bt_node->r_child = q;									//创建的右孩子将其当作子树的根节点,进行递归
	BT_Init(bt_node->r_child, data, n, 2 * pos + 2);		//这里是创建右侧分支的结点,仍然是先创建左子树,再创建右子树。
	return OK;
}
  1. 访问二叉树
/*
method:
	访问结点
param:
	bt_node		二叉树
*/
void Visit(BT_NODE* bt_node)
{
   
    printf("%d  ", bt_node->data);							//打印出来二叉树的结点值
}
  1. 先序遍历二叉树
/*
method:
	先序遍历二叉树
param:
	bt_node		二叉树
*/
void Preorder(BT_NODE* bt_node)
{
   
	if (bt_node != NULL)
	{
   
		Visit(bt_node);										//先访问根节点
		Preorder(bt_node->l_child);							//再访问左结点
		Preorder(bt_node->r_child);							//最后访问右结点
	}
}
  1. 中序遍历二叉树
/*
method:
	中序遍历二叉树
param:
	bt_node		二叉树
*/
void Infix_Order(BT_NODE
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值