Java中怎么实现 二叉树平衡
发表于:2025-02-03 作者:千家信息网编辑
千家信息网最后更新 2025年02月03日,Java中怎么实现 二叉树平衡,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。二叉树平衡的基本思想是通过旋转使得平衡因子的
千家信息网最后更新 2025年02月03日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安全错误
数据库的锁怎样保障安全
传奇服务器怎么租
成都安卓软件开发费用
菏泽大学生网络安全
阿里云查看服务器保有时间
巨潮数据库官网入口
武昌区方便网络安全维护要多少钱
四川工控软件开发价位
网络安全宣传儿童画竖着画
哈罗单车 网络技术
数据库的文件名是什么文件
ims数据库数据单位6
品质网络技术咨询软件
哪种数据库属于非关系型
怎么查看魔兽世界服务器
本地服务器文档编辑
全国网络安全小视频学生版
关于网络安全专业
深圳柒喜互联网科技有限公司
b站服务器挂了2022
山东曹县网络安全
dna数据库的危害
网络安全系统英文
拿到新的服务器应该做什么
互联网科技为什么在美国上市
网络安全防护与渗透测试
利用网络技术但不是网络犯罪
应用程序和数据库逻辑结构
服务器安全狗卸不干净
网络安全法对个人有何影响
计算机网络技术 行业背景