平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作
来源:互联网 发布:json 中括号 编辑:程序博客网 时间:2024/05/21 07:56
/** * @version 创建时间: 2017-11-21 下午10:10:27 * 类说明:AVL树 */public class AVLTree<E extends Comparable<E>> { Node<E> root; int size = 0; private static final int LH = 1; private static final int RH = -1; private static final int EH = 0;
/** * 类说明:定义类 */public class Node<E extends Comparable<E>> { E elemet; int balance = 0; Node<E> left; Node<E> right; Node<E> parent; public Node(E elem, Node<E> pare) { this.elemet = elem; this.parent = pare; } public E getElemet() { return elemet; } public void setElemet(E elemet) { this.elemet = elemet; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } public Node<E> getLeft() { return left; } public void setLeft(Node<E> left) { this.left = left; } public Node<E> getRight() { return right; } public void setRight(Node<E> right) { this.right = right; } public Node<E> getParent() { return parent; } public void setParent(Node<E> parent) { this.parent = parent; }}/** * 左旋(对节点X进行左旋) * r γ α β* 如上图 */public void left_rotate(Node<E> x){ if(x==null){ return ; } Node<E> Y=x.left; Node<E> parent=x.parent; // step1: x的右子 指向 β x.right=Y.left; if(Y.left!=null){ Y.left.parent=x; } // step2: Y的左子 指向 X Y.parent=x.parent; if(x.parent==null){ root=Y; }else{ if(parent.left==x){ parent.left= Y; }else if(parent.right==x){ parent.right= Y; } } // step3: x的父指向 Y Y.left=x; x.parent=Y;}/*** 右旋(对节点Y进行右旋) * r γ α β */public void right_rotate(Node<E> Y){ if(Y==null){ return ; } Node<E> x=Y.left; Node<E> parent=Y.parent; // step1: Y的左子 指向 β Y.left=x.right; if(x.right !=null){ x.right.parent=Y; } // step2: X的右子 指向 Y Y.parent=x.parent; if(x.parent==null){ root=Y; }else{ if(parent.left==Y){ parent.left= x; }else if(parent.right==Y){ parent.right= x; } } // step3: x的父指向 parent x.right=Y; Y.parent=x;}/** * 右平衡操作,即结点t的不平衡是因为右子树过深 */public void rightBalance(Node<E> t){ Node<E> tr = t.right; switch (tr.balance) { case RH://如果新的结点插入到t的右孩子的右子树中,则直接进行左旋操作即可left_rotate(t); t.balance = EH; tr.balance = EH; break; case LH://如果新的结点插入到p的右孩子的左子树中,则需要进行分情况讨论Node<E> trl = tr.left; switch (trl.balance) { case LH://情况a:当p的右孩子的左子树根节点的balance = LHt.balance = EH; tr.balance = RH; trl.balance = EH; break; case RH://情况b:当p的右孩子的左子树根节点的balance = RHt.balance = LH; tr.balance = EH; trl.balance = EH; break; case EH://情况C:当p的右孩子的左子树根节点的balance = EHt.balance = EH; tr.balance = EH; trl.balance = EH; break; } //旋转 right_rotate(t.right); left_rotate(t); break; case EH: break; }}/** * 左平衡 */public void leftBalance(Node<E> t){ Node<E> tl=t.right; switch (tl.balance) { case RH://如果新的结点插入到t的左孩子的左子树中,则直接进行右旋操作即可right_rotate(t); tl.balance=EH; t.balance=EH; break; case LH://如果新的结点插入到t的左孩子的右子树中,则需要进行分情况讨论Node<E> tlr = tl.right; switch (tlr.balance) { case RH://情况a:当t的左孩子的右子树根节点的balance = RHt.balance=EH; tl.balance=LH; tlr.balance=EH; break; case LH://情况b:当p的左孩子的右子树根节点的balance = LHt.balance=RH; tl.balance=EH; tlr.balance=EH; break; case EH://情况c:当p的左孩子的右子树根节点的balance = EHt.balance=EH; tl.balance=EH; tlr.balance=EH; break; default: break; } left_rotate(t.left); right_rotate(t); break; default: break; }}
阅读全文
0 0
- 平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作
- 平衡二叉树创建,左旋,右旋,左平衡和右平衡
- AVL树 封装左旋 右旋操作
- AVL实现平衡二叉树
- AVL 平衡二叉树
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- AVL 平衡二叉树
- avl平衡二叉树
- 二叉平衡树AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树 AVL
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 平衡二叉树(AVL)
- 区块链获得获得华尔街的胜利:“现在我们知道它有用了”
- eventbus线程间轻量级传递消息的使用
- 分布式事务
- Android调用系统相机、图库、裁剪图片并压缩上传(适配7.0)
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之十二《查询已经加入的channel名称》
- 平衡二叉树(AVL树)一图一步骤代码实现左旋右旋,左右平衡操作
- MVVM
- leetcode: 96. Unique Binary Search Trees
- Tether宣布3000万美元代币被盗
- Ubuntu install sogoupinyin
- 编程规范 命名风格 摘自《阿里巴巴 Java 开发手册》
- Java之HashMap简答题——2017.11.18
- JQuery相关的知识点
- C++的cout高阶格式化操作