树的顺序存储与链式存储

版权声明:本文为博主原创文章,转载请附明出处^_^ https://blog.csdn.net/cprimesplus/article/details/89574924

二叉树的顺序存储

一、完全二叉树与满二叉树

如图是一棵满二叉树,采用顺序存储结构对其进行存储如下:
结点 A B C D E F G
下标 1 2 3 4 5 6 7

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


二、非完全二叉树

对于非完全二叉树来说,同样可以采用顺序存储结构,上面描述的父子下标关系同样适用。
结点 A B # D E
下标 1 2 3 4 5

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


二叉链表与三叉链表

  二叉链表表示树比三叉链表所需空间少,然而想要达到访问双亲的目的,就需要对树进行遍历。
  三叉链表比二叉链表多了 p a r e n t 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;
}

猜你喜欢

转载自blog.csdn.net/cprimesplus/article/details/89574924