平衡二叉树只是一种思想,有很多种实现,常见的实现有红黑树、AVL、Treap、伸展树等。 6.2.AVL树 6.2.1.概述 AVL是出现的第一种平衡二叉树,每当插入元素,造成AVL树的不平衡后,它会通过旋转的方式调整最小不平衡树,从而将树调整平衡。插入后造成不平衡的元素叫“破坏者”,最小不平衡树的根节点叫“被破坏者”。
void RightBalance(BSTree &T)//对以指针T所指结点为根的二叉树作右平衡旋转处理 { BSTree rc,ld; rc=T->rchild; //树是由平衡到失衡的,即T->bf=-2,右边插入,故不可能为2 //所以可以直接有T的左右孩子的平衡因子来判断是何种类型 switch(rc->bf) { /* 当右孩子的平衡因子为-1时,-2,-1属于“...
}//RL旋转node *doubleRightLeftRotation(node *root) { root->right =singleLeftRotation(root->right);returnsingleRightRotation(root); }//高度检测intgetHeight(node *root) {if(root == NULL)return0;returnmax(getHeight(root->left),getHeight(root->right)) +1; }//平衡树插入node *insert(node ...
46.47.#defineLH +1 /* 左高 */48.#defineEH 0 /* 等高 */49.#defineRH -1 /* 右高 */50.51./*对以指针T所指结点为根的二叉树作左平衡旋转处理*/52./*本算法结束时,指针T指向新的根结点*/53.voidLeftBalance(BiTree *T)54. {55. BiTree L,Lr;56. L=(*T)->lchild;/*L指向T的左子树...
因此,数学上证明了平衡二叉树的高度能达到log2(2)。 平衡二叉树的调整 插入数据后,平衡二叉树如何继续保持平衡? 在调整过程中,要保证平衡二叉树依然是搜索树。 RR旋转 如上图,若“麻烦结点”插入在B_R后(可左、可右),则以“发现者”作为根节点进行旋转。
因此,数学上证明了平衡二叉树的高度能达到log2(2)。 平衡二叉树的调整 插入数据后,平衡二叉树如何继续保持平衡? 在调整过程中,要保证平衡二叉树依然是搜索树。 RR旋转 如上图,若“麻烦结点”插入在B_R后(可左、可右),则以“发现者”作为根节点进行旋转。
大体可以分成这几种旋转类型 , 把旋转类型理解了 , 就可以看着代码来理解 , 我也是看着代码才弄明白 , 所以不用慌! 1#include<stdlib.h>2#include<stdio.h>3#defineEH04#defineRH-1/// 这三个是平衡因子5#defineLH167typedefstructNode{8intBF;9intdata;10structNode*left,*right;11}*Bitree,BitreeNode...
三.代码解释 个人感觉此算法的代码实现比其抽象出来的过程更难懂,所以附上代码的详细解释。 main函数: 最后附上链接:平衡二叉树(AVL树)及C语言实现 (biancheng.net) 一.单向右旋(RR)和左旋(LL) 1. 2. 二.双向旋转(LR与RL) 三.代码解释 __EOF__...
④RL平衡旋转:对于根节点:右边比左边多对于右节点:左边比右边多先右后左(先处理右节点,再处理根节点)AC代码:#include<iostream> #include<algorithm> using namespace std; int n; struct node{ int data; node *lchild,*rchild; }; node *Newnode(int x){//新建一个结点 node* newnode=new node; new...