Java中怎么实现 二叉树平衡
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Java中怎么实现 二叉树平衡,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。二叉树平衡的基本思想是通过旋转使得平衡因子的
千家信息网最后更新 2025年12月02日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安全错误
数据库的锁怎样保障安全
服务器的超时是什么意思
网络安全前端防护网
旅游局开展网络安全自查报告
物联网网络技术培训
UNIX软件开发工程师招聘
数据库插件多大
解决服务器定时自动重启故障
华为西安软件开发工资
vb读取mysql数据库
北京最具实力机器人软件开发公司
用户访问数据库最小单位
邯郸程序软件开发大概多少钱
联想服务器管理网口网关
学网络技术以后干嘛
一般软件系统连接不同数据库
2华为网络技术大赛
.net 软件开发管理
diskgennet数据库使用
大话西游2 最火爆的服务器
网络安全和网站设计哪个好
数据库防火墙测试
优酷流媒体服务器
查询服务器品牌
长宁区专业网络技术检修
解耦 数据库
oracle 数据库游标
网络安全的三个部分
大数据科技互联网模板
华润机电工程数据库
没有防火墙服务器对网络危害