Java中怎么实现 二叉树平衡
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,Java中怎么实现 二叉树平衡,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。二叉树平衡的基本思想是通过旋转使得平衡因子的
千家信息网最后更新 2024年11月14日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安全错误
数据库的锁怎样保障安全
香港服务器 试用
中专计算机网络技术学些什么科目
网络安全法 案例及分析
网址首页中文科技期刊数据库
吉林市盘古网络技术公司
人民的名义软件开发公司
dsp芯片用什么软件开发
经纪人小说软件开发
原神服务器崩毁怎么回事
上海海昱互联网科技有限公司
2u服务器尺寸多少
河南app软件开发靠谱吗
国产数据库市场占有率排行
广州汇丰银行 软件开发
天津市完美互联网络技术咨询
安顺ibm服务器代理商
中国大唐网络安全管理办法
快30了还去学软件开发
途志互联网科技有限公司
内存数据库 nosql
医院网络安全员文件
中学网络安全推进会
北京航天导弹军工软件开发薪水
服务器操作记录
权限管理数据库
禁止连续输入7个数据库
传统关系型数据库已被淘汰
监控怎么设置网络安全
美国云服务器
安徽游戏软件开发流程