树、二叉树、二叉查找树、AVL树、伸展树、B-树

目录

1.一般的树(tree)

定义:

实现:

树的遍历:

2.二叉树(binary tree)

定义:

实现:

应用:

3.查找树--二叉查找树(binary search tree)

定义:

操作:

4.AVL树(Adelson-Velsky-Landis Tree )

定义:

单旋转(single rotation):

双旋转(double rotation):

5.伸展树(splay tree)

定义:

展开:

6.树的遍历

7.B-树(B-tree)

定义:

应用:


1.一般的树(tree)

定义:

一棵树是是N个节点和N-1条边的集合,其中的一个节点叫做

任意节点的深度为从跟到该节点的唯一路径的长。一棵树的深度等于它的最深的树叶的深度。

任意节点的是从该节点到一片树叶的最长路径的长。一棵树的高等于它的根的高。树的深度等于树的高。

实现:

每个节点除数据外,有一个指针指向该节点的第一个儿子,另一个指针指向该节点的下一个兄弟。

typedef struct ThreeNode *PtrToNode;
struct TreeNode
{
	ElementType Element;
	PtrToNode FirstChild;
	PtrToNode NextSibling;
}

树的遍历:

先序遍历(preorder traversal):先处理根节点,然后处理左右儿子。(使用:操作系统的目录结构)

中序遍历(Inorder traversal):先处理左儿子,在处理根节点,最后处理右儿子。(使用:计算表达式树)

后续遍历(postorder traversal):先处理左右左右儿子,然后处理根节点。(使用:计算文件目录的大小)

注:先序,中序,后续中的先、中、后是对于而言的。

 

2.二叉树(binary tree)

定义:

二叉树是一棵树,其中每个节点都不能有多于两个的儿子。

实现:

节点由数据,和两个指向左右儿子的指针构成。

typedef struct ThreeNode *PtrToNode;
typedef struct ThreeNode *Tree;

struct TreeNode
{
	ElementType Element;
	Tree Left;
	Tree Right;
}

应用:

表达式树:树叶是操作数(常量和变量),其他节点是操作符(+-*/)。

 

3.查找树--二叉查找树(binary search tree)

定义:

对于树中的每个节点X,它的左子树中所有关键字小于X的关键字,它的右子树中所有关键字大于X的关键字。

操作:

MakeEmpty()

Find()

FindMin()

FindMax()

Insert()

Delete()

二叉查找树,任意节点的期望深度为O(logN)

上述操作的平均运行时间都是O(logN)

 

4.AVL树(Adelson-Velsky-Landis Tree )

定义:

AVL树是带有平衡条件的二叉查找树,其每个节点的左子树和右子树的高度最多差1。

单旋转(single rotation):

对X节点的左儿子的左子树进行一次插入;

对X节点的右儿子的右子树进行一次插入。

双旋转(double rotation):

对X节点的左儿子的右子树进行一次插入;(先右旋转再左旋转)

对X节点的右儿子的左子树进行一次插入。(先左旋转再右旋转)

 

5.伸展树(splay tree)

定义:

一种放弃平衡条件,允许树有任意深度的自调整(self-adjusting)树。

当一个节点被访问后,它就要经过一系列AVL树的旋转被放到根上。

它保证从空树开始任意连续M次对树的操作最多花费O(MlogN)时间。一棵伸展树每次操作的摊还代价是O(logN)

展开:

  • 之字形(zig-zag):

     双旋转

  • 一字型(zig-zig):

    左右树变换。

 

6.树的遍历

  • 按照排序的顺序列出所有的关键字(中序遍历):
void PrintTree(SearchTree T)
{
	if(T!=NULL)
	{
	PrintTree(T->Left);
	PrintElement(T->Element);
	PrintTree(T->Right);
	}
}
  • 计算一个节点的高度(后续遍历):
int Height(Tree T)
{
	if(T==NULL)
	   return -1;
	else
	    return 1+Max(Height(T->Left),Height(T->Right));   

}
  • 先序遍历:

利用节点深度标志每一个节点。

  • 层序遍历(level-order tracersal):

所有深度为D的节点要再深度为D+1的节点之前处理。(使用队列实现)

 

7.B-树(B-tree)

定义:

阶为M的B-树,

树的根或者是一片树叶,或者其儿子数再2和M之间。

除根外,所有非树叶节点的儿子数在[M/2]和M之间。

所有的树叶都在相同的深度上。

所有的数据存储在树叶上。

在每一个内部节点上皆含有指向该节点各儿子指针P1,P2.....PM

在每一个内部节点上皆含有代表子树P1,P2.....PM中发现的最小关键字的值k1,k2......km

对于每一节点,其子树P1中所有关键字都小于子树P2的关键字,依次类推。

在非根数叶中关键字的个数也在[M/2]和M之间。

应用:

数据库系统。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值