Java中怎么实现 二叉树平衡
发表于:2024-11-12 作者:千家信息网编辑
千家信息网最后更新 2024年11月12日,Java中怎么实现 二叉树平衡,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。二叉树平衡的基本思想是通过旋转使得平衡因子的
千家信息网最后更新 2024年11月12日Java中怎么实现 二叉树平衡
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输入:待插元素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(); //继续检查其父亲}//whilereturn 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;}看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。
孩子
子树
结点
输入
输出
三个
代码
元素
节点
四棵
帮助
检查
清楚
内容
因子
对此
思想
情况
文章
新手
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网发展高科技企业
美国互联网科技巨头
数据库查询最高薪资和最低薪资
何为代理服务器
我是大东家服务器注册人数已满
查看当前数据库无法连接服务器
120台服务器多大功率
漳州歌谷网络技术
acd网络安全
河南正规软件开发公司
三级数据库技术教材电子版
x86服务器怎么设计
杭州下城区软件开发公司
数据库名称可以随意命名对不对
app 服务器通讯安全
java数据库结构
沃赛互联网科技有限公司
mzd 服务器
数据库冷备份和热备份
切实维护网络安全需要
塔式服务器安全性
新网络技术合作伙伴
数据库技术哪家好
怎么租服务器玩海外游戏
焦点网络安全海报
西门子服务器故障F036
软件开发工作对象
网络安全法与电信营运商
校园网络安全宣传标语大全
青海曙光服务器维修维保价格