平衡二叉树就是一颗排序二叉树,只不过比排序二叉树又多了一个条件,那就是每一个结点的左子树的高和右子树的高的差的绝对值(bf值)不能超过1,这样就可以解决一些排序二叉树不效率的问题了。
第一张图很明显的二叉排序树的优势就完全没有了,变成了普通的线性遍历搜索了。但是他变形成为一颗AVL平衡二叉树后,明显的效率就提高了,例如查找5,AVL3次,第一张的5次。
const int EH = 0; const int LH = 1; const int RH = -1; class Node { public int data; public int bf; public Node cLeft; public Node cRight; }
平衡二叉树AVL的结点,每个结点都保存着一个bf值,就是它左子树-右子树的值的状态。
三个const表示,EH相等,LH左边高1,RH右边高1,没有出现高2的,因为有的话就会去平衡它了。
左右旋转操作:→
左平衡:→
插入操作:→
删除操作:→
完整的代码可以看:Github