不能忘本,要經常寫點演算法
今天來個經典的二叉排序樹
也叫二叉搜尋樹,兩年前的記憶有點模糊
有事還得問度娘(下面是鏈結)
二叉排序樹
簡單用遞迴定義下,可以這樣描述
一顆二叉排序樹是滿足下列性質的二叉樹:
(1)若它的左子樹不為空,則其左子樹上任意結點的關鍵字的值都小於根結點關鍵字的值。
(2)若它的右子樹不為空,則其右子樹上任意結點的關鍵字的值都大於根節點關鍵字的值。
(3)它的左、右子樹本身又是乙個二叉查詢樹。
二叉排序樹應該是一顆平衡二叉樹(好像是這麼定義的),意思就是左右節點差不多。
然後他的搜尋效能貌似是趨近二分查詢(寫到這我就想到0。618比二分快)
但是因為對資料操作比較方便,比如插入刪除資料,不會做太大的變化,相比連續儲存空間,要少操作很大一段的資料。所以還是很好用的(雖然我現在也沒用到,可能是個假的程式設計師吧)。
節點的資料結構可以定義為
package bstsearch;
/** * created by zhangguanlong on 2017/12/14.
*//**
*@function 二叉搜尋樹中的節點
*/public
class
node
}
查詢
而二叉查詢樹的查詢過程為從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中;否則,如果查詢關鍵字比結點關鍵字小,就進入左子樹;如果比結點關鍵字大,就進入右子樹;如果左子樹或右子樹的指標為空,則報告找不到相應的關鍵字。
插入 把乙個新的記錄r插入到二叉查詢樹,應該保證在插入之後不破壞二叉查詢樹的結構性質。因此,為了執行插入操作首先應該查詢r所在的位置。查詢時,仍然採用上述的遞迴演算法。若查詢失敗,則把包含r的結點插在具有空子樹位置,若查詢成功,則不執行插入,操作結束。
刪除 刪除不太好描述
借用一下大神們畫的圖 刪葉子節點 內部節點
內部節點
後兩幅應該是要刪18這個節點,這是有左右根節點的子節點
要在子樹中選擇乙個合適的替換節點,替換節點一般來說會是右子樹中的最小的節點。
然後給出樹結構**,寫注釋是個好習慣,畢竟菜呢
package bstsearch;
/** * created by zhangguanlong on 2017/12/14.
*//**
*@function 二叉搜尋樹的示範**
*/public
class
binarysearchtree
/***@param id 待查詢的值
*@return
*@function 預設搜尋函式
*/public
boolean
find(int id) else
if (current.data > id) else
}return
false;
}/**
*@param id
*@function 插入某個節點
*/public
void
insert(int id)
//設定current指標指向當前根節點
node current = root;
//設定父節點為空
node parent = null;
//遍歷直到找到第乙個插入點
while (true)
} else }}
}/**
*@param id
*@return
*@function 刪除樹中的某個元素
*/public
boolean
delete(int id) else
if (current == null)
}//如果待刪除的節點沒有任何子節點
//直接將該節點的原本指向該節點的指標設定為null
if (current.left == null && current.right == null)
if (isleftchild == true) else
}//如果待刪除的節點有乙個子節點,且其為左子節點
else
if (current.right == null) else
if (isleftchild) else
} else
if (current.left == null) else
if (isleftchild) else
}//如果待刪除的節點有兩個子節點
else
if (current.left != null && current.right != null) else
if (isleftchild) else
successor.left = current.left;
}return
true;
}/**
*@param delelenode
*@return
*@function 在樹中查詢最合適的節點
*/private node getsuccessor(node delelenode)
if (successsor != delelenode.right)
return successsor;
}/**
*@function 以中序順序遍歷樹
*/public
void
display()
private
void
display(node node) }}
測試**
package bstsearch;
import org.junit.before;
import org.junit.test;
/** * created by zhangguanlong on 2017/12/14.
*/public
class
binarysearchtreetest
@test
public
void
testfind()
@test
public
void
testinsert()
@test
public
void
testdelete()
}
還可以吧,長夜漫漫,陪伴我的只有**和**
好了,不耍(zhuang)帥(bi)了,其實還沒下班。。。
JAVA 二叉排序樹
二叉排序樹 二叉檢索樹 author lao yang public class binarysearchtree 插入乙個節點,假如已經存在這個值返回 false 否則true param value 節點值 return 插入成功與否 public boolean insert int valu...
java實現二叉排序樹
二叉排序樹 非空左子樹的所有鍵值小於其根節點的鍵值 非空右子數的所有鍵值大於其根節點的鍵值 左右子數都是二叉排序樹 建立先是建立一棵樹 然後進行新增節點 比根節點小那麼就放到左子樹 在進行遞迴 比根節點大那麼就放到右子數 在進行遞迴 public void add node node if node...
B 二叉排序樹(比較兩個二叉排序樹)
description 二叉排序樹的定義是 或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。今天我們要判斷兩序列是否為同一二叉排序樹 input ...