树的存储结构
### 双亲表示法 双亲表示法可以根据某结点的*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;
孩子表示法
- 根据树的度,声明足够空间存放子树指针的结点(造成浪费)。
- 每个结点加一个表示指针个数的位。(维护较难)
- 数组和链表结合。
双亲孩子表示法
//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;
}