平衡二叉树(c++)实现
------ 欢迎指正-------
1、参考资料:
书籍:《算法导论》
博文:http://www.cnblogs.com/fivestudy/fivestudy/p/10340647.html 原理讲的很棒。有动画,方便理解。
这个网站可以清晰看清楚平衡二叉树的插入删除等详细过程: https://www.cs.usfca.edu/~galles/visualization/AVLtree.html
源码:
#include <iostream> using namespace std; struct node { int data; int height; node *lc; node *rc; node() : data(0) , height(0) , lc(0) , rc(0) { } }; // 平衡二叉树 class avltree2 { public: // 构造函数 avltree2() : root(NULL) { } virtual ~avltree2(){} //--------------------------------------------------------- // 返回结点的高度 int height(node *pnode) { return pnode == NULL ? 0 : pnode->height; } // 计算两个的最大值 int max(int a, int b) { return a > b ? a : b; } //------------------------------------------------------------ /* 旋转代码: LL型 RR型 LR型 RL型 */ // 左旋转, 函数命名方式是以二叉树插入结点的形状命名的,这里的左旋, // 对应的形状是 RR型,即在结点右孩子插入结点。 node *rotate_rr(node *pnode) { node *ret_node = NULL; if (NULL != pnode) { // 保存失衡结点的右孩子 node *loss_balance_node_rc = pnode->rc; // 将失衡结点的右孩子的左孩子赋值给失衡结点的右孩子 pnode->rc = loss_balance_node_rc->lc; // 将失衡结点作为失衡结点的左孩子 loss_balance_node_rc->lc = pnode; // 更新失衡结点与新根结点的高度 pnode->height = max(height(pnode->lc), height(pnode->rc)) + 1; loss_balance_node_rc->height = max( height( loss_balance_node_rc->lc), height(loss_balance_node_rc->rc)) + 1; ret_node = loss_balance_node_rc; } return ret_node; } // 右旋, 函数名是以插入结点后的形式命名的,这里是 // 将新结点插入后,形成LL形状, node *rotate_ll(node *pnode) { node *ret_node = NULL; if (NULL != pnode) { node *loss_balance_node_lc = pnode->lc; if (NULL != loss_balance_node_lc) { // 将失衡结点的左孩子的右孩子为失衡结点的左孩子 pnode->lc = loss_balance_node_lc->rc; // 将失衡结点作为失衡结点左孩子的右孩子 loss_balance_node_lc->rc = pnode; // 更新高度 pnode->height = max(height(pnode->lc), height(pnode->rc)) + 1; loss_balance_node_lc->height = max( height(loss_balance_node_lc->lc),