树
出现原因:对于大量的输入数据,链表的线性访问时间太慢
而树的大部分操作的运行时间平均为O(logN)
定义:n个结点的有限集合(n>0)
递归定义:1.根节点
2.除根节点的m个不相交有限集也是树,根的子树
树的实现:链表存储
typedef struct _node{
int value;
struct _node *brother;
struct _node *son;
}treenode;
*具有N个结点的每棵二叉树都需N+1个NULL指针
二叉树
定义:一颗每结点不多于2个儿子的树
typedef struct _node{
int value;
struct _node *left;
struct _node *right;
}treenode;
二叉查找树
定义:树中每个结点x,它的左子树中的所有关键字值小于x,它的右子树中所有关键字值大于x
对象集:二叉查找树
操作集:void Makeempty(treenode *T);
treenode *Find(teenode *T);
teenode *Findmin(treenode *T);
treenode *Findmax(treenode *T);
int Retrieve(treenode *T);
treenode *Insert(treenode *T);
treenode *Delete(treenode *T);
AVL树
带有自平衡条件的二叉查找树
*其操作是建立在二叉查找树的基础上
*其insert/delete需要旋转以达到自平衡的目的
旋转函数:
treenode *Singlerotatewithleft(treenode *k2);
treenode *Doublerotatewithleft(treenode *k3);
treenode *Singlerotatewithright(treenode *k1);
treenode *Doublerotatewithright(treenode *k1);
伸展树
B-树