数据结构-树的存储结构

树的存储结构


### 双亲表示法   双亲表示法可以根据某结点的*Parent*指针找到它的双亲结点,所用时间复杂度为*O(1)*,但当找某个结点的子结点时,就需要遍历整个树结构。
#define MAX_TREE_SIZE 100
//结点定义
typedef int ElemType;

typedef struct PTNode
{
	ElemType data;
	int parent;
};PTNode;

//定义树的结构
typedef struct
{
	PTNode nodes[MAX_TREE_SIZE];
	int r;  //根的位置
	int n;	//结点数目
}PTree; 

孩子表示法

  1.    根据树的度,声明足够空间存放子树指针的结点(造成浪费)。
  2.    每个结点加一个表示指针个数的位。(维护较难)
  3.    数组和链表结合。

双亲孩子表示法

//parent_child.c

#define MAX_TREE_SIZE 100

typedef char ElemType

//孩子结点 
typedef struct CTNode
{
	int child;   //存放孩子结点的下标
	struct CTNode *next;//指向下一个孩子结点的指针
}*ChildPtr;


//表头结构
typedef struct
{
	ElemType data;//存放在树中的结点的数据
	int parent;//存放双亲的下标
	ChildPtr firstchild;//指向第一个孩子的指针
}CTBox;


//树结构
typedef struct
{
	CTBox nodes[MAX_TREE_SIZE];//结点数组
	int r,n;//r根结点,n结点数
}

#二叉树
###二叉树的存储结构
  二叉树的顺序存储结构就是用一维数组存储二叉树中个各个结点,并且结点的存储位置能体现结点之间的逻辑关系。
  二叉树的链式存储结构为二叉链表,每个结点有一个数据域和两个指针域。
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

二叉树的建立和遍历

  二叉树的遍历(Traversing Binary Tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使每个结点被访问且仅被访问一次。
//BiTree.C
#include <stdio.h>
#include <stdlib.h>
typedef char ElemType;

//定义结点
typedef struct BiTNode
{
	char data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

//创建二叉树 默认为前序遍历输入 叶子结点用空格表示
CreateBiTree(BiTree *T)
{
	char c;
	scanf("%c",&c);
	if(' '==c)
	{
		*T=NULL;
	}
	else
	{
		*T=(BiTNode *)malloc(sizeof(BiTNode));
		(*T)->data=c;
		//递归调用创建左右子树
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}


//访问二叉树结点的具体操作
visit(char c)
{
	printf("%c位于第%d层\n",c,level);
}


//遍历二叉树 默认前序遍历
PreOrderTraverse(BiTree T,int level)
{
	if(T)
	{
		visit(T->data,level);
		PreOrderTraverse(T->lchild,level+1);
		PreOrderTraverse(T->rchild,level+1);
	}	
}

int main()
{
	int level=1;
	BiTree T=NULL;
	
	CreateBiTree(&T);
	PreOrderTraverse(T,level)

	return 0;
}
发布了36 篇原创文章 · 获赞 0 · 访问量 610

猜你喜欢

转载自blog.csdn.net/weixin_43199933/article/details/104911435