java實現平衡二叉排序樹增刪

2021-08-31 11:29:45 字數 2804 閱讀 8189

在學習了普通二叉排序樹的演算法之後,我們發現了它的一些不足,如果我們的普通二叉樹在插入資料的時候造成樹的一側資料過多的話,就會使得查詢的時候效率大大降低,在極端情況下,我們插入一串有序的數,原本的二叉樹就會變成鍊錶,例如,插入:1,2,3,4,5,6,結果就會變成下圖這樣:

這樣就違背了我們二叉樹的初衷,相當於有一邊的孩子節點失去了意義,這種二叉樹就是不平衡的二叉樹。

那麼具體什麼樣的二叉樹是不平衡的二叉樹呢?

我們規定,如果乙個樹節點的左孩子節點高度和右孩子節點高度的差大於等於2,則這個節點就是不平衡的節點,同時這個差值叫做這個節點的平衡因子。

也就是說,如果乙個節點的平衡因子絕對值大於等於2了,這個節點就失衡了。

例如下面幾種情況(這裡平衡因子以左子樹高度-右子樹高度為例):

我們發現,右子樹比左子樹高度差達到2了,形象地來說,現在右邊的樹枝太重了,樹不平衡了。如果變成下圖這樣就會平衡了:

這裡,我們稱為對結點1做了左單旋操作。

我們發現,左子樹比右子樹高度差達到2了,樹不平衡了。如果變成下圖這樣就會平衡了:

這裡,我們稱為對結點3做了右單旋操作。

對於這種情況,我們需要通過兩步將它變為平衡:

1.先對2節點進行右旋

2.再對1節點進行左旋

1.先對1節點進行左旋

2.再對2節點進行右旋

至此,我們已經說完了各種基本操作,現在讓我們來看**:

樹的結構:

public

class

tree

基本操作:

public

static tree rightrotate

(tree root)

//右單旋

public

static tree leftrotate

(tree root)

//左單旋

public

static tree leftandright

(tree root)

//先左旋再右旋

public

static tree rightandleft

(tree root)

//先右旋再左旋

public

static tree findnextnode

(tree root)

//找到右子樹下最小的節點

tree r = root.rightchild;

while

(r !=

null

&& r.leftchild !=

null

)return r;

}

插入:

public

static tree insert

(tree root, int data)

if(data <= root.data)

else}}

else

else}}

// 當插入新的節點後,從這個節點到根節點的最短路徑上的節點的高度值一定會發生改變,另外當出現失衡點時,這個失衡點的所有祖先節點的高度值也可能會發生改變

root.height = math.

max(

getheight

(root.leftchild)

,getheight

(root.rightchild))+

1;// 重新調整root節點的高度值

return root;

}

刪除:

public

static tree remove

(tree root, int data)

if(data < root.data)

else}}

else

if(data == root.data)

else

}else

else}}

if(root !=

null

)return root;

}

java實現二叉排序樹

二叉排序樹 非空左子樹的所有鍵值小於其根節點的鍵值 非空右子數的所有鍵值大於其根節點的鍵值 左右子數都是二叉排序樹 建立先是建立一棵樹 然後進行新增節點 比根節點小那麼就放到左子樹 在進行遞迴 比根節點大那麼就放到右子數 在進行遞迴 public void add node node if node...

JAVA 二叉排序樹

二叉排序樹 二叉檢索樹 author lao yang public class binarysearchtree 插入乙個節點,假如已經存在這個值返回 false 否則true param value 節點值 return 插入成功與否 public boolean insert int valu...

二叉排序樹建立 JAVA實現

最近看了一下二叉排序樹的建立,自己寫了一段 用來建立二叉排序樹,給定乙個陣列,對這個陣列中的數字進行建立二叉排序樹。分兩種情況 1 陣列中的數字是隨機的,也就是說沒有順序 eg int a 用這個陣列中的數字建立二叉排序樹,注意這裡的二叉排序樹是隨便的,沒有特殊的要求 比如建立高度最小的二叉排序樹 ...