线型
表:线型的特点无特殊要求
顺序:查询,修改方便,插入,删除不方便,定长浪费空间
链式:查询,修改不方便,插入,删除方便,节约空间灵活
栈:满足线型的条件下,还要满足先进后出
顺序:定长浪费空间
链式:节约空间灵活
队列:满足线型的条件下,还要满足先进先出
顺序:定长浪费空间
链式:节约空间灵活
树
n(n>=0)个结点的集合,这些节点互不相交,有一个根节点
根节点没有直接前驱,有n(>=0)个直接后继
其他节点,有唯一之前前驱,有n(>=0)个直接后继
层次:根节点开始依次向下计数
树的深度:最大层次节点的层次
度:直接后继的个数
树的度:最大度
叶子节点/外部节点:度为0
分支节点/内部节点:度不为0
关系:双亲,兄弟,堂兄弟,祖先
二叉树:
由一个根节点,和左右两颗子树组成,并且这两颗子树又是二叉树;度最大为2;需要区分左右的顺序。
满二叉树:
有K层的树,节点总数为2^k – 1
完全二叉树:1.只有最后两层有叶子节点
2.并且叶子节点在左部连续
霍夫曼树,平衡二叉树,红黑树,B树,B+树,A树,233树
存储
顺序存储:根节点为n,左孩子为2n+1,右孩子为2n+2
链式存储:
遍历
层次遍历
先序遍历 (根左右)
中序遍历 (左根右)
后序遍历 (左右根)
#ifndef _SQTREE_H
#define _SQTREE_H
#define N 1024
typedef char sqtree_data_t;
typedef struct sqtree{
sqtree_data_t buf[N];
int len;
}sqt_node,*sqt_pnode;
//创建空间
sqt_pnode create_space();
//创建树
int create_sqtree(sqt_pnode T, int pos);
//打印树
int show_sqtree(sqt_pnode T);
#endif
#include <stdio.h>
#include <stdlib.h>
#include "sqtree.h"
sqt_pnode create_space()
{
sqt_pnode T = (sqt_pnode)malloc(sizeof(sqt_node));
if(NULL == T)
{
printf("T is NULL\n");
return NULL;
}
T->len = 0;
return T;
}
int create_sqtree(sqt_pnode T, int pos)
{
sqtree_data_t ch;
scanf("%c", &ch);
//退出条件
if(ch == '$')
{
T->buf[pos] = '#';
T->len++;
return 0;
}
T->buf[pos] = ch;
T->len++;
//创建左子树
create_sqtree( T, 2*pos+1);
//创建右子树
create_sqtree(T, 2*pos+2);
return 0;
}
int show_sqtree(sqt_pnode T)
{
if(NULL == T)
{
printf("T is NULL\n");
return -1;
}
if(T->len == 0)
{
printf("T is empty\n");
return -1;
}
int i;
for(i = 0; i < T->len; i++)
{
printf("buf[%d]=%c ", i, T->buf[i]);
}
puts("");
return 0;
}
int main()
{
sqt_pnode T = create_space();
create_sqtree(T,0);
show_sqtree(T);
}