- 平衡二叉树的基本介绍
-
-
平衡二叉排序树的左旋转与右旋转:
-
-
package com.model.tree; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/7/16 20:07 * 演示平衡二叉排序树的创建(AVL) */ public class TreeDemo09 { public static void main(String[] args) { int[] array={4,3,6,5,7,8}; AVCTree avcTree = new AVCTree();//平衡二叉搜索树 for (int i = 0; i < array.length; i++) { avcTree.add(new AVLNode(array[i])); } avcTree.infixOrder(); avcTree.leftRotation();//左旋转 avcTree.rightRotation();//右旋转 System.out.println(avcTree.getHeight()); System.out.println(avcTree.getLeftHeight()); System.out.println(avcTree.getRightHeight()); System.out.println("-------------------------"); int[] array1={8,7,6,5,4,2,1}; AVCTree avcTree1 = new AVCTree(); for (int i = 0; i < array1.length; i++) { avcTree1.add(new AVLNode(array1[i])); } while (Math.abs(avcTree1.getLeftHeight()-avcTree1.getRightHeight())>1) { avcTree1.rightRotation(); avcTree1.leftRotation(); } System.out.println(avcTree1.getHeight()); System.out.println(avcTree1.getLeftHeight()); System.out.println(avcTree1.getRightHeight()); } } class AVCTree{ private AVLNode root; // 右旋转 public void rightRotation(){ if (root==null){ return; }else { if (getLeftHeight()-getRightHeight()>1){ root.rightRotation(); } } } //左旋转 public void leftRotation(){ if (root==null){ return; }else { if (getRightHeight()-getLeftHeight()>1){ root.leftRotation(); } } } // 中序遍历节点 public void infixOrder(){ if (root==null){ System.out.println("树为空,无法进行遍历"); return; }else { root.infixOrder(); } } // 添加节点 public void add(AVLNode node){ if (root==null){ root=node; }else { root.add(node); } } // 获得当前树的高度 public int getHeight(){ if (root==null){ return 0; }else { return root.getHeight(); } } public int getLeftHeight(){ if (root==null){ return 0; }else { if (root.getLeft()==null){ return 0; }else { return root.getLeft().getHeight(); } } } public int getRightHeight(){ if (root==null){ return 0; }else { if (root.getRight()==null){ return 0; }else { return root.getRight().getHeight(); } } } public AVCTree(AVLNode root) { this.root = root; } public AVCTree() { } public AVLNode getRoot() { return root; } public void setRoot(AVLNode root) { this.root = root; } } class AVLNode{ private int value; private AVLNode left; private AVLNode right; // 右旋转 public void rightRotation(){ AVLNode newRoot = new AVLNode(this.value); newRoot.right=this.right; newRoot.left=this.left.right; this.value=this.left.value; this.left=this.left.left; this.right=newRoot; } //左旋转 public void leftRotation(){ AVLNode newRoot = new AVLNode(this.value); newRoot.left=this.left; newRoot.right=this.right.left; this.value=this.right.value; this.right=this.right.right; this.left=newRoot; } // 统计当前节点的高度 public int getHeight(){ return Math.max(this.left==null?1:this.left.getHeight()+1,this.right==null?1:this.right.getHeight()+1); } public void infixOrder(){ if (this.left!=null){ this.left.infixOrder(); } System.out.println(this.toString()); if (this.right!=null){ this.right.infixOrder(); } } public void add(AVLNode node){ if (node==null){ return; }else { if (this.value>node.value){ if (this.left==null) { this.left = node; }else { this.left.add(node); } }else{ if (this.right==null) { this.right = node; }else { this.right.add(node); } } } } @Override public String toString() { return "AVLNode{" + "value=" + value + '}'; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public AVLNode getLeft() { return left; } public void setLeft(AVLNode left) { this.left = left; } public AVLNode getRight() { return right; } public void setRight(AVLNode right) { this.right = right; } public AVLNode(int value) { this.value = value; } }
-
平衡二叉排序树的双旋转:
-
-
package com.model.tree; /** * @Description:测试类 * @Author: 张紫韩 * @Crete 2021/7/16 20:07 * 演示平衡二叉排序树的创建(AVL) */ public class TreeDemo09 { public static void main(String[] args) { int[] array={4,3,6,5,7,8}; AVCTree avcTree = new AVCTree();//平衡二叉搜索树 for (int i = 0; i < array.length; i++) { avcTree.add(new AVLNode(array[i])); } avcTree.infixOrder(); avcTree.leftRotation();//左旋转 avcTree.rightRotation();//右旋转 System.out.println(avcTree.getHeight()); System.out.println(avcTree.getLeftHeight()); System.out.println(avcTree.getRightHeight()); System.out.println("-------------------------"); int[] array1={8,7,6,5,4,2,1}; AVCTree avcTree1 = new AVCTree(); for (int i = 0; i < array1.length; i++) { avcTree1.add(new AVLNode(array1[i])); } while (Math.abs(avcTree1.getLeftHeight()-avcTree1.getRightHeight())>1) { avcTree1.rightRotation(); avcTree1.leftRotation(); } System.out.println(avcTree1.getHeight()); System.out.println(avcTree1.getLeftHeight()); System.out.println(avcTree1.getRightHeight()); System.out.println("----------------------"); AVCTree tree = new AVCTree(); tree.add(new AVLNode(10)); tree.add(new AVLNode(11)); tree.add(new AVLNode(7)); tree.add(new AVLNode(6)); tree.add(new AVLNode(8)); tree.add(new AVLNode(9)); tree.rightRotation(); System.out.println(tree.getLeftHeight()); System.out.println(tree.getRightHeight()); System.out.println(tree.getHeight()); System.out.println(tree.getRoot()); tree.infixOrder(); } } class AVCTree{ private AVLNode root; // 右旋转 public void rightRotation(){ if (root==null){ return; }else { if (getLeftHeight()-getRightHeight()>1){ // 检查是否需要进行双旋转 if (root.getLeft()!=null){ if (root.getLeft().getRight()!=null&&root.getLeft().getLeft()!=null){ if (root.getLeft().getRight().getHeight()>root.getLeft().getLeft().getHeight()){ root.getLeft().leftRotation(); } } } root.rightRotation(); } } } //左旋转 public void leftRotation(){ if (root==null){ return; }else { if (getRightHeight()-getLeftHeight()>1){ // 检查是否需要进行双旋转 if (root.getRight()!=null){ if (root.getRight().getLeft()!=null&&root.getRight().getRight()!=null){ if (root.getRight().getLeft().getHeight()>root.getRight().getRight().getHeight()){ root.getRight().rightRotation(); } } } root.leftRotation(); } } } // 中序遍历节点 public void infixOrder(){ if (root==null){ System.out.println("树为空,无法进行遍历"); return; }else { root.infixOrder(); } } // 添加节点 public void add(AVLNode node){ if (root==null){ root=node; }else { root.add(node); } } // 获得当前树的高度 public int getHeight(){ if (root==null){ return 0; }else { return root.getHeight(); } } public int getLeftHeight(){ if (root==null){ return 0; }else { if (root.getLeft()==null){ return 0; }else { return root.getLeft().getHeight(); } } } public int getRightHeight(){ if (root==null){ return 0; }else { if (root.getRight()==null){ return 0; }else { return root.getRight().getHeight(); } } } public AVCTree(AVLNode root) { this.root = root; } public AVCTree() { } public AVLNode getRoot() { return root; } public void setRoot(AVLNode root) { this.root = root; } } class AVLNode{ private int value; private AVLNode left; private AVLNode right; // 右旋转 public void rightRotation(){ AVLNode newRoot = new AVLNode(this.value); newRoot.right=this.right; newRoot.left=this.left.right; this.value=this.left.value; this.left=this.left.left; this.right=newRoot; } //左旋转 public void leftRotation(){ AVLNode newRoot = new AVLNode(this.value); newRoot.left=this.left; newRoot.right=this.right.left; this.value=this.right.value; this.right=this.right.right; this.left=newRoot; } // 统计当前节点的高度 public int getHeight(){ return Math.max(this.left==null?1:this.left.getHeight()+1,this.right==null?1:this.right.getHeight()+1); } public void infixOrder(){ if (this.left!=null){ this.left.infixOrder(); } System.out.println(this.toString()); if (this.right!=null){ this.right.infixOrder(); } } public void add(AVLNode node){ if (node==null){ return; }else { if (this.value>node.value){ if (this.left==null) { this.left = node; }else { this.left.add(node); } }else{ if (this.right==null) { this.right = node; }else { this.right.add(node); } } } } @Override public String toString() { return "AVLNode{" + "value=" + value + '}'; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public AVLNode getLeft() { return left; } public void setLeft(AVLNode left) { this.left = left; } public AVLNode getRight() { return right; } public void setRight(AVLNode right) { this.right = right; } public AVLNode(int value) { this.value = value; } }
Java--算法--平衡二叉树(AVL树)
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
下一篇:Java的字节流
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
【数据结构】二叉树的存储结构
【数据结构】第五章——树与二叉树详细介绍二叉树的存储结构……
二叉树 数据结构 C语言 -
AVL树(平衡二叉树)图解
AVL平衡的四种情形图解C++
c++ AVL 数据结构 子树 i++ -
Java 平衡二叉树和AVL
与BST<> 进行对比 AvLMap:
二分搜索 删除节点 子树