树的顺序存储与链式存储

二叉树的顺序存储

一、完全二叉树与满二叉树
如图是一棵满二叉树,采用顺序存储结构对其进行存储如下:
结点ABCDEFG
下标1234567

通过层次顺序对这棵树的结点进行编号,由于每个父亲结点下对应两个孩子结点,因此对应的两个孩子结点的下标分别是: ( 2 × n ) (2\times n) (2×n) ( 2 × n + 1 ) (2\times n +1) (2×n+1)


二、非完全二叉树
对于非完全二叉树来说,同样可以采用顺序存储结构,上面描述的父子下标关系同样适用。
结点AB#DE
下标12345

不难发现,尽管 C C C 这个结点不存在,但是为了能够适用父子下标关系,它也需要占一个位置——这样在树的形状不是很规则的情况下,便会造成大量空间的浪费,因此提出了链式存储。


二叉链表与三叉链表

  二叉链表表示树比三叉链表所需空间少,然而想要达到访问双亲的目的,就需要对树进行遍历。
  三叉链表比二叉链表多了 p a r e n t parent parent指针用来记录双亲结点,可以很快达到访问双亲的目的。
  选择使用哪种表示方法还要看具体场景。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef char ElemType;
typedef struct Node{
	ElemType data;
	struct Node *lnode, *rnode;
	struct Node *parent;
}BiNode, TriNode;
void PreOrderTraverse(BiNode *btree)
{
	if(!btree)
		printf("#");
	else{
		printf("%c", btree->data);
		PreOrderTraverse(btree->lnode);
		PreOrderTraverse(btree->rnode);
	}
}
void CreateBiNode(BiNode *&btree)								// 二叉链表表示树
{
	ElemType data;
	scanf("%c", &data);
	if(data == '#')
		btree = NULL;
	else{
		if(!(btree = (BiNode *)malloc(sizeof(BiNode)))) exit(0);
		btree->data = data;
		CreateBiNode(btree->lnode);
		CreateBiNode(btree->rnode);
	}
}
void CreateTriNode(TriNode *&tritree, TriNode *temp, bool flag)	 // 三叉链表表示树
{
	char data;
	scanf("%c", &data);
	if(data == '#')
		tritree = NULL;
	else{
		if(!(tritree = (TriNode *)malloc(sizeof(TriNode)))) exit(0);
		if(!flag)
			tritree->parent = NULL;
		else tritree->parent = temp;
		tritree->data = data;
		CreateTriNode(tritree->lnode, tritree, true);
		CreateTriNode(tritree->rnode, tritree, true);
	}
}
int main()
{
	BiNode *root;
	TriNode *tri;
	//CreateBiNode(root);
	//PreOrderTraverse(root);
	CreateTriNode(tri, NULL, false);
	PreOrderTraverse(tri);
	return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值