二叉排序樹問題分析java
左子樹所有爲空,從形式上看更像一個單鏈表node
插入速度沒有影響git
查詢速度明顯下降ide
解決方案:平衡二叉樹this
基本介紹atom
平衡二叉樹也叫二叉搜索樹,保證查詢效率較高spa
它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,而且左右兩棵子樹都是一棵平衡二叉樹對象
經常使用的實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等blog
使用條件排序
右子樹高度與左子樹高度插值大於1的時候,使用左旋轉
要求
給定數列{4,3,6,5,7,8},建立對應的平衡二叉樹
建立二叉排序樹
此時若轉換爲平衡二叉樹,下降右子樹的高度
思路分析
建立一個新節點newNode ,值等於當前根節點的值
把新節點的左子樹設置爲當前節點的左子樹,newnode.left = left
把新結點的右子樹設置爲當前節點右子樹的左子樹newNode.right = right.left
把當前節點的值換位右子節點的值 value = right.value
把當前節點的右子樹設置成右子樹的右子樹right = right.right
把當前節點的左子樹設置爲新節點 left = newLeft
轉換後
要求
使用數列{10,12,8,9,7,6},建立平衡二叉樹
建立二叉排序樹
基本思路
建立新的節點newNode,使得newNode.value = this.value
將newNode的右子樹設置爲this的右子樹,newNode.right = this.right
將newNode的左子樹設置爲this左子樹的右子樹,newNode.left = this.left.right
把this節點的值換爲左子節點的值,this.value = this.left.value
將this節點的左子樹設置爲左子樹的左子樹,this.left = this.left.left
將this節點的右子樹 設置爲newNode,this.right = newNode
轉換後
要求
使用數列{10,11,7,6,8,9},建立平衡二叉樹
建立二叉排序樹
思路分析
當孩子節點知足左旋轉或右旋轉條件時,先平衡孩子 節點,後平衡父節點
package com.why.tree;
/**
* @Description TODO 平衡二叉樹
* @Author why
* @Date 2020/12/6 15:56
* Version 1.0
**/
public class AVLTreeDemo {
public static void main(String[] args) {
int[] arr = {10,11,7,6,8,9};
//建立AVLTree對象
AVLTree avlTree = new AVLTree();
//添加節點
for (int i = 0; i < arr.length; i++) {
avlTree.add(new AVLNode(arr[i]));
}
//遍歷
System.out.println("中序遍歷:");
avlTree.midOrder();
//根節點樹的高度
System.out.println("根節點樹的高度: " + avlTree.height());
System.out.println("左子樹高度:" + avlTree.leftHeight());
System.out.println("右子樹高度:" + avlTree.rightHeight());
System.out.println("根節點:" + avlTree.getRoot());
}
}
/**
* AVL,平衡二叉樹
*/
class AVLTree{
private AVLNode root;
public AVLNode getRoot() {
return root;
}
public void setRoot(AVLNode root) {
this.root = root;
}
/**
* 添加節點
* @param node
*/
public void add(AVLNode node){
if (root == null){//直接放上
root = node;
}else {
root.add(node);
}
}
/**
* 中序遍歷
*/
public void midOrder(){
if (root != null){
root.midOrder();
}else {
System.out.println("二叉排序樹爲空");
}
}
/**
* 查找需刪除的節點
* @param value
* @return
*/
public AVLNode search(int value){
if (root == null){