Posts Tagged ‘AVL’

November 16, 2009

  这里只给出一个简单的实现,具体原理参见Google、Baidu的各个角落及各大教材。做两点说明:
仅仅实现了必要的左旋、右旋处理,左平衡、右平衡操作,以及数据的插入操作,
不可重复插入数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef int Type; //~ 节点数据类型
typedef struct Node
{
	Type data;
	int bf;
	Node *left, *right;
	Node(){ bf = 0; left = right = 0; }
} AVLNode, *AVLTree; //~ 平衡树及其节点
 
void RRotate(AVLTree & T) //~ 右旋处理,T的左孩子成为新子树根
{
	AVLNode * tmp = T->left;
	T->left = tmp->right;
	tmp->right = T;
	T = tmp;
}
Tags: ,,.
August 12, 2009

严老太,在您面前小孙孙我实在心智底下啊!一个AVL就把我整的团团转,单向右旋,单向左旋,双向旋转先左后右,双向旋转先右后左,很简单的道理,您就是不肯轻易说出来,在那转啊转的,貌似很神秘的样子!

在构造AVL树的时候,会出现插入某个节点后输不再平衡的情况,这时候只需要找到离插入点最近的、平衡因子不合法的节点,调整以此节点为根的子树(*),使其平衡因子合法,其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异,但原则都是一样的:首先应该明确根节点大于左孩子而小于右孩子,另外,调整后的子树(*)的根是一定会发生变化的,且变化后的子树应该满足平衡条件,即平衡因子为1,0,-1之一。
rotate sample

Tags: ,,.

AVL是一种二叉搜索树(Binary Search Tree),被称为平衡树(Balanced Binary Tree),由Adelsonr Velskii 和Landis 提出并以他们的名字命名。

今天看严蔚敏老太太的数据结构,她老人家是这么描述AVL的:AVL,它或者是一棵空树,或者是具有以下性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差(平衡因子:BF)的绝对值不超过1。看着这么个定义很别扭,总觉得对平衡因子的要求比较弱,也可能是我悟性较弱吧,在这句话上我很是下了一番功夫……如果这样来定义的话,可能会让我更容易理解一些:

  1. 根的左子树和右子树的高度差的最大值为1,空树的高度为0。
  2. 根的左子树和右子树都是AVL树。
Tags: ,,.
Page 1 of 11