数据算法之二叉树平衡(BinTreeNode Rotate)的Java实现
来源:互联网 发布:团购网站源码 编辑:程序博客网 时间:2024/06/05 16:46
本文的代码来自于《数据结构与算法(JAVA语言版)》,是笔者在网上找到的资料,非正式出刊版物。笔者对代码一些比较难以理解的部分添加了注释和图解,欢迎大家来讨论。
二叉树平衡的基本思想是通过旋转使得平衡因子的绝对值小于1。
如图所示:
输入:失衡的结点z
输出:平衡后子树的根结点
private BinTreeNode rotate(BinTreeNode z){ BinTreeNode y = higherSubT(z); //取y 为z 更高的孩子 BinTreeNode x = higherSubT(y); //取x 为y 更高的孩子 boolean isLeft = z.isLChild(); //记录:z 是否左孩子 BinTreeNode p = z.getParent(); //p 为z 的父亲 BinTreeNode a, b, c; //自左向右,三个节点 BinTreeNode t0, t1, t2, t3; //自左向右,四棵子树 // 以下分四种情况重命名 if (y.isLChild()) { //若y 是左孩子,则 c = z; t3 = z.getRChild(); if (x.isLChild()) { //若x 是左孩子(左左失衡) b = y; t2 = y.getRChild(); a = x; t1 = x.getRChild(); t0 = x.getLChild(); } else { //若x 是右孩子(左右失衡) a = y; t0 = y.getLChild(); b = x; t1 = x.getLChild(); t2 = x.getRChild(); } } else { //若y 是右孩子,则 a = z; t0 = z.getLChild(); if (x.isRChild()) { //若x 是右孩子(右右失衡) b = y; t1 = y.getLChild(); c = x; t2 = x.getLChild(); t3 = x.getRChild(); } else { //若x 是左孩子(右左失衡) c = y; t3 = y.getRChild(); b = x; t1 = x.getLChild(); t2 = x.getRChild(); } } //摘下三个节点 z.sever(); y.sever(); x.sever(); //摘下四棵子树 if (t0!=null) t0.sever(); if (t1!=null) t1.sever(); if (t2!=null) t2.sever(); if (t3!=null) t3.sever(); //重新链接 a.setLChild(t0); a.setRChild(t1); c.setLChild(t2); c.setRChild(t3); b.setLChild(a); b.setRChild(c); //子树重新接入原树 if (p!=null) if (isLeft) p.setLChild(b); else p.setRChild(b); return b;//返回新的子树根}//返回结点v 较高的子树private BinTreeNode higherSubT(BinTreeNode v){ if (v==null) return null; int lH = (v.hasLChild()) ? v.getLChild().getHeight():-1; int rH = (v.hasRChild()) ? v.getRChild().getHeight():-1; if (lH>rH) return v.getLChild(); if (lH<rH) return v.getRChild(); if (v.isLChild()) return v.getLChild(); else return v.getRChild();}
输入:待插元素ele
输出:在AVL 树中插入ele
代码:
public void insert(Object ele){ super.insert(ele); root = reBalance(startBN);}//从v 开始重新平衡AVL 树private BinTreeNode reBalance(BinTreeNode v){ if (v==null) return root; BinTreeNode c = v; while (v!=null) { //从v 开始,向上逐一检查z 的祖先 if (!isBalance(v)) v = rotate(v); //若v 失衡,则旋转使之重新平衡 c = v; v = v.getParent(); //继续检查其父亲 }//while return c;}//判断一个结点是否失衡private boolean isBalance(BinTreeNode v){ if (v==null) return true; int lH = (v.hasLChild()) ? v.getLChild().getHeight():-1; int rH = (v.hasRChild()) ? v.getRChild().getHeight():-1; return (Math.abs(lH - rH)<=1);}
输入:待删元素ele
输出:在AVL 树中删除ele
代码:
public Object remove(Object ele){ Object obj = super.remove(ele); root = reBalance(startBN); return obj;}
0 0
- 数据算法之二叉树平衡(BinTreeNode Rotate)的Java实现
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现
- 平衡二叉树的实现算法
- 平衡二叉树的java实现
- java实现平衡二叉树的建立
- 平衡二叉树的java实现
- java 平衡二叉树的实现
- 平衡二叉树的实现 java
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码
- 平衡二叉树(AVL树)算法 Java实现
- 【LintCode-93】平衡二叉树(Java实现-递归算法)
- java --平衡二叉树实现
- java实现二叉平衡树
- 平衡二叉树Java实现
- 平衡二叉树java实现
- C++模板实现二叉树(五 树的平衡之dsw算法)
- cinder-backup程序流程
- LintCode笔记(11)—— 带重复元素的子集
- ssh整合错误:HTTP Status 500 - Unable to instantiate Action, empaction
- zjnu AllButOneDivisor
- Centos7配置DNS
- 数据算法之二叉树平衡(BinTreeNode Rotate)的Java实现
- C++查询mysql数据库
- MarkDown转换PDF,Word,Html格式
- Spring Web Flow 2.0 入门详解
- 4407: 于神之怒加强版
- JS逻辑表达式的探索
- 即将震撼登场:Chrome标记为“不安全”的非HTTPS网站
- 霍夫变换的直线检测原理和注意事项
- 沟通的双向性