java資料結構和演算法——平衡二叉樹之左旋轉
1、平衡二叉樹左旋轉思路圖解
2、什麼時候進行平衡二叉樹左旋轉
- 當右子樹與左子樹高度差的絕對值大於1是進行左旋轉
3、平衡二叉樹左旋轉目的
- 降低右子樹高度
4、求二叉樹高度程式碼示例
1)、建立一個節點類 Node
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 建立一個節點類 Node
* @author: xiaozhi
* @create: 2020-10-13 22:04
*/
public class Node {
public int value;//節點的值
public Node left;//左節點
public Node right;//右節點
//構造方法
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
/**
* @Description: 返回以當前節點為根節點的樹的高度
* @Author: xz
* @Date: 2020/10/13 22:07
*/
public int height(){
return Math.max(left ==null ? 0 : left.height(),right == null ? 0 : right.height())+1;
}
/**
* @Description: 返回左子樹的高度
* @Author: xz
* @Date: 2020/10/13 22:10
*/
public int leftHeight(){
if(left == null){
return 0;
}
return left.height();
}
/**
* @Description: 返回右子樹的高度
* @Author: xz
* @Date: 2020/10/13 22:11
*/
public int rightHeight(){
if(right ==null){
return 0;
}
return right.height();
}
/**
* @Description: 一、遞迴的形式新增結點,注意需要滿足二叉排序樹的要求
* @Param: node 傳入的幾點
* @Author: xz
* @Date: 2020/9/27 21:58
*/
public void addNode(Node node){
if(node == null){
return;
}
if(node.value < this.value){//新增的結點的值 < 當前結點的值
if(this.left == null){ //如果當前結點左子結點為null
this.left = node;
}else{//遞迴的向左子樹新增
this.left.addNode(node);
}
}else{//新增的結點的值 > 當前結點的值
if(this.right == null){ //如果當前結點右子結點為null
this.right = node;
}else{//遞迴的向右子樹新增
this.right.addNode(node);
}
}
}
/**
* @Description: 二、中序遍歷二叉排序樹
* @Param:
* @Author: xz
* @return:
* @Date: 2020/9/27 22:09
*/
public void infixOrder(){
//左子節點不為null,向左子節點中序遍歷
if(this.left != null){
this.left.infixOrder();
}
//輸出當前節點
System.out.println(this);
//右子節點不為null,向右子節點中序遍歷
if(this.right != null) {
this.right.infixOrder();
}
}
}
2)、建立平衡二叉樹類(即AVL樹類)
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 建立平衡二叉樹(即AVL樹)
* @author: xiaozhi
* @create: 2020-10-13 22:13
*/
public class AVLTree {
public Node root;
public Node getRoot() {
return root;
}
/**
* @Description: 一、新增二叉排序樹節點方法
* @Param: node 傳入的節點
* @Author: xz
* @Date: 2020/9/27 22:18
*/
public void addBstNode(Node node){
if(root == null){//如果root為空則直接讓root指向node
root = node;
}else{
root.addNode(node);
}
}
/**
* @Description: 二、中序遍歷二叉排序樹方法
* @Param:
* @Author: xz
* @return:
* @Date: 2020/9/27 22:25
*/
public void infixOrder() {
if(root != null) {
root.infixOrder();
} else {
System.out.println("二叉排序樹為空,不能遍歷");
}
}
}
3)、建立二叉樹測試類
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 平衡二叉樹測試類
* @author: xiaozhi
* @create: 2020-10-13 22:15
*/
public class AVLTreeTest {
public static void main(String[] args) {
//定義一個陣列
int[] arr={4,3,6,5,7,8};
//建立一個AVL樹物件
AVLTree avlTree = new AVLTree();
//新增節點
for(int i=0;i<arr.length;i++){
avlTree.addBstNode(new Node(arr[i]));
}
//中序遍歷
System.out.println("中序遍歷二叉樹==============");
avlTree.infixOrder();
System.out.println("沒有進行平衡處理前============");
System.out.println("樹的高度:"+avlTree.getRoot().height());
System.out.println("左子樹的高度:"+avlTree.getRoot().leftHeight());
System.out.println("右子樹的高度:"+avlTree.getRoot().rightHeight());
}
}
4)、執行main函式,輸出結果如下:
5、平衡二叉樹左旋轉程式碼示例(基於求二叉樹高度的基礎上新增左旋轉方法程式碼)
1)、建立一個節點類 Node
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 建立一個節點類 Node
* @author: xiaozhi
* @create: 2020-10-13 22:04
*/
public class Node {
public int value;//節點的值
public Node left;//左節點
public Node right;//右節點
//構造方法
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
/**
* @Description: 返回以當前節點為根節點的樹的高度
* @Author: xz
* @Date: 2020/10/13 22:07
*/
public int height(){
return Math.max(left ==null ? 0 : left.height(),right == null ? 0 : right.height())+1;
}
/**
* @Description: 返回左子樹的高度
* @Author: xz
* @Date: 2020/10/13 22:10
*/
public int leftHeight(){
if(left == null){
return 0;
}
return left.height();
}
/**
* @Description: 返回右子樹的高度
* @Author: xz
* @Date: 2020/10/13 22:11
*/
public int rightHeight(){
if(right ==null){
return 0;
}
return right.height();
}
/**
* @Description: 左旋轉方法
* @Author: xz
* @Date: 2020/10/13 22:44
*/
public void leftRotate() {
//建立新的結點,以當前根結點的值
Node newNode = new Node(value);
//把新的結點的左子樹設定成當前結點的左子樹
newNode.left = left;
//把新的結點的右子樹設定成帶你過去結點的右子樹的左子樹
newNode.right = right.left;
//把當前結點的值替換成右子結點的值
value = right.value;
//把當前結點的右子樹設定成當前結點右子樹的右子樹
right = right.right;
//把當前結點的左子樹(左子結點)設定成新的結點
left = newNode;
}
/**
* @Description: 一、遞迴的形式新增結點,注意需要滿足二叉排序樹的要求
* @Param: node 傳入的幾點
* @Author: xz
* @Date: 2020/9/27 21:58
*/
public void addNode(Node node){
if(node == null){
return;
}
if(node.value < this.value){//新增的結點的值 < 當前結點的值
if(this.left == null){ //如果當前結點左子結點為null
this.left = node;
}else{//遞迴的向左子樹新增
this.left.addNode(node);
}
}else{//新增的結點的值 > 當前結點的值
if(this.right == null){ //如果當前結點右子結點為null
this.right = node;
}else{//遞迴的向右子樹新增
this.right.addNode(node);
}
}
//當新增完一個結點後,如果: (右子樹的高度-左子樹的高度) > 1 , 左旋轉
if(rightHeight() - leftHeight() > 1) {
leftRotate();
}
}
/**
* @Description: 二、中序遍歷二叉排序樹
* @Param:
* @Author: xz
* @return:
* @Date: 2020/9/27 22:09
*/
public void infixOrder(){
//左子節點不為null,向左子節點中序遍歷
if(this.left != null){
this.left.infixOrder();
}
//輸出當前節點
System.out.println(this);
//右子節點不為null,向右子節點中序遍歷
if(this.right != null) {
this.right.infixOrder();
}
}
}
2)、建立平衡二叉樹類(即AVL樹)
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 建立平衡二叉樹(即AVL樹)
* @author: xiaozhi
* @create: 2020-10-13 22:13
*/
public class AVLTree {
public Node root;
public Node getRoot() {
return root;
}
/**
* @Description: 一、新增二叉排序樹節點方法
* @Param: node 傳入的節點
* @Author: xz
* @Date: 2020/9/27 22:18
*/
public void addBstNode(Node node){
if(root == null){//如果root為空則直接讓root指向node
root = node;
}else{
root.addNode(node);
}
}
/**
* @Description: 二、中序遍歷二叉排序樹方法
* @Param:
* @Author: xz
* @return:
* @Date: 2020/9/27 22:25
*/
public void infixOrder() {
if(root != null) {
root.infixOrder();
} else {
System.out.println("二叉排序樹為空,不能遍歷");
}
}
}
3)、建立平衡二叉樹測試類
package com.rf.springboot01.dataStructure.avlTree;
/**
* @description: 平衡二叉樹測試類
* @author: xiaozhi
* @create: 2020-10-13 22:15
*/
public class AVLTreeTest {
public static void main(String[] args) {
//定義一個陣列
int[] arr={4,3,6,5,7,8};
//建立一個AVL樹物件
AVLTree avlTree = new AVLTree();
//新增節點
for(int i=0;i<arr.length;i++){
avlTree.addBstNode(new Node(arr[i]));
}
//中序遍歷
System.out.println("中序遍歷二叉樹==============");
avlTree.infixOrder();
System.out.println("平衡二叉樹進行左旋轉處理後============");
System.out.println("樹的高度:"+avlTree.getRoot().height());
System.out.println("左子樹的高度:"+avlTree.getRoot().leftHeight());
System.out.println("右子樹的高度:"+avlTree.getRoot().rightHeight());
}
}
4)、執行main函式,輸出結果如下:
相關文章
- 資料結構-平衡二叉樹資料結構二叉樹
- 演算法與資料結構——AVL樹(平衡二叉搜尋樹)演算法資料結構
- 【資料結構與演算法】手撕平衡二叉樹資料結構演算法二叉樹
- 資料結構與演算法-二叉查詢樹平衡(DSW)資料結構演算法
- 資料結構與演算法-二叉查詢樹平衡(AVL)資料結構演算法
- 資料結構和演算法:二叉樹資料結構演算法二叉樹
- 重學資料結構之樹和二叉樹資料結構二叉樹
- 資料結構之「二叉樹」資料結構二叉樹
- 資料結構之樹結構概述(含滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹、紅黑樹、B-樹、B+樹、B*樹)資料結構二叉樹
- 資料結構和演算法-二叉樹,AVL,紅黑樹資料結構演算法二叉樹
- Java 樹結構實際應用 四(平衡二叉樹/AVL樹)Java二叉樹
- [資料結構] 樹、二叉樹、森林的轉換資料結構二叉樹
- 什麼是泛型?,Set集合,TreeSet集合自然排序和比較器排序,資料結構-二叉樹,資料結構-平衡二叉樹泛型排序資料結構二叉樹
- 【資料結構與演算法】二叉樹資料結構演算法二叉樹
- 資料結構(樹):二叉樹資料結構二叉樹
- 資料結構之「二叉搜尋樹」資料結構
- 資料結構高階--AVL(平衡二叉樹)(圖解+實現)資料結構二叉樹圖解
- 重學資料結構(六、樹和二叉樹)資料結構二叉樹
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 資料結構與演算法:二叉排序樹資料結構演算法排序
- 資料結構 - 二叉樹資料結構二叉樹
- 資料結構-二叉樹資料結構二叉樹
- 常用資料結構之線索二叉樹資料結構二叉樹
- 資料結構和演算法-Go實現二叉搜尋樹資料結構演算法Go
- 資料結構與演算法-表示式二叉樹資料結構演算法二叉樹
- 資料結構與演算法-kd二叉樹(kNN)資料結構演算法二叉樹KNN
- 資料結構與演算法-二叉查詢樹資料結構演算法
- 資料結構與演算法-二叉樹性質資料結構演算法二叉樹
- 資料結構與演算法-二叉樹遍歷資料結構演算法二叉樹
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- java實現-資料結構之二叉樹(三):線索化二叉樹Java資料結構二叉樹
- 【java 資料結構】還不會二叉樹?一篇搞定二叉樹Java資料結構二叉樹
- 十三、Mysql之平衡二叉樹(AVL樹)MySql二叉樹
- 資料結構與演算法-kd二叉樹(基礎)資料結構演算法二叉樹
- 【演算法與資料結構 02】二叉樹的引入演算法資料結構二叉樹
- 【資料結構&演算法】12-線索二叉樹資料結構演算法二叉樹
- 『資料結構與演算法』二叉查詢樹(BST)資料結構演算法
- 資料結構之二叉搜尋樹—Java實現資料結構Java