数据结构与算法系列-树-二叉树存储结构

顺序存储结构

顺序存储结构对完全二叉树而言,既简单又节省存储空间。但是,对于一般二叉树的数序存储,为了能用结点在一维数组中的相对位置来表示结点之间的逻辑关系,也必须按照完全二叉树的形式来存储树中的节点,造成存储空间浪费。二叉树可以用数组或线性表来存储,而且如果这是完全二叉树,这种方法不会浪费空间。用这种紧凑排列,如果一个结点的索引为i,它的子结点能在索引2i+1和2i+2找到,并且它的父节点(如果有)能在索引floor((i-1)/2)找到(假设根节点的索引为0)。这种方法更有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。然而,它需要连续的存储空间,这样在存储高度为h的n个结点组成的一般普通树时将会浪费很多空间。一种最极坏的情况下如果深度为h的二叉树每个节点只有右孩子需要占用2的h次幂减1,而实际却只有h个结点,空间的浪费太大,这是顺序存储结构的一大缺点。


二叉链表

二叉树一般采用二叉链表作为链式存储结构。

在这种存储方式下,二叉树的每个结点包括三个成员。

lchild
(指向该结点左孩子的指针)
data
结点本身的值
rchild
(指向该结点右孩子的指针)





三叉链表

改进于二叉链表,增加父节点的指引,能更好地实现节点间的访问,不过算法相对复杂。这里不再介绍。


用二叉链表表示二叉树
#include<malloc.h>
#include<stdio.h>
typedef struct btnode{
	int data;
	struct btnode *lchild;
	struct btnode *rchild;
}BTNODE,*BINTREE;
void createbintree(BINTREE *t){/*输入二叉树的先嘘遍历序列,创建二叉链表*/
	int a;
	scanf("%d",&a);
	if(a==0)
		*t=NULL;
	else{
		*t = (BTNODE *)malloc(sizeof(BTNODE));/*申请结点*t的结点空间*/
		(*t)->data = a;/*将结点数据a放入根结点的数据域*/
		createbintree(&(*t)->lchild);/*建立左子树*/
		createbintree(&(*t)->rchild);/*建立左子树*/
	}

}

main(){
	BINTREE t= NULL;
	
	createbintree(&t);
	
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值