线型
表:线型的特点无特殊要求
顺序:查询,修改方便,插入,删除不方便,定长浪费空间
链式:查询,修改不方便,插入,删除方便,节约空间灵活
栈:满足线型的条件下,还要满足先进后出
顺序:定长浪费空间
链式:节约空间灵活
队列:满足线型的条件下,还要满足先进先出
顺序:定长浪费空间
链式:节约空间灵活
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
- #include
- #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);
- }