1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $ ssh FenglinHou@Dalian ~% cd Wdir/ ~/Wdir% cat dump.cpp #inlcude <everything> int main() { std::set<std::Girl> ().clear(); std::ifstream lifein("~/*"); std::ofstream lifeout("~/*"); std::copy(std::istream_iterator<std::stuff>(lifein), std::istream_iterator<std::stuff>(), std::ostream_iterator<std::stuff>(lifeout, "\newday")); return (0); } ~/Wdir% cat Makefile dump:dump.cpp g++ -odump dump.cpp ~/Wdir% make ~/Wdir% ./dump |
Posts Tagged ‘AVL’
May 4, 2010
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; } |
August 12, 2009
严老太,在您面前小孙孙我实在心智底下啊!一个AVL就把我整的团团转,单向右旋,单向左旋,双向旋转先左后右,双向旋转先右后左,很简单的道理,您就是不肯轻易说出来,在那转啊转的,貌似很神秘的样子!
在构造AVL树的时候,会出现插入某个节点后输不再平衡的情况,这时候只需要找到离插入点最近的、平衡因子不合法的节点,调整以此节点为根的子树(*),使其平衡因子合法,其实就是使这棵子树(*)的高度与插入节点前相比不发生变化。具体的调整策略因具体情况而异,但原则都是一样的:首先应该明确根节点大于左孩子而小于右孩子,另外,调整后的子树(*)的根是一定会发生变化的,且变化后的子树应该满足平衡条件,即平衡因子为1,0,-1之一。

AVL是一种二叉搜索树(Binary Search Tree),被称为平衡树(Balanced Binary Tree),由Adelsonr Velskii 和Landis 提出并以他们的名字命名。
今天看严蔚敏老太太的数据结构,她老人家是这么描述AVL的:AVL,它或者是一棵空树,或者是具有以下性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差(平衡因子:BF)的绝对值不超过1。看着这么个定义很别扭,总觉得对平衡因子的要求比较弱,也可能是我悟性较弱吧,在这句话上我很是下了一番功夫……如果这样来定义的话,可能会让我更容易理解一些:
- 根的左子树和右子树的高度差的最大值为1,空树的高度为0。
- 根的左子树和右子树都是AVL树。
Page 1 of 11