/**
* @author chenyi
* @Description 二叉排序樹
* @date 2022/2/23 10:12
*/
public class BinarySortTreeDemo {
Node root;
public static void main(String[] args) {
int[] arr = {7, 3, 10, 12, 5, 1, 9, 2};
BinarySortTreeDemo treeDemo = new BinarySortTreeDemo();
for (int i : arr) {
treeDemo.add(i);
}
treeDemo.perOrder();
System.out.println("測試刪除節(jié)點");
treeDemo.del(1);
treeDemo.del(2);
treeDemo.del(3);
treeDemo.del(5);
treeDemo.del(0);
treeDemo.perOrder();
}
public void add(int val) {
if (root == null) {
root = new Node(val);
return;
}
Node node = new Node(val);
Node temp = root;
Node parent;
do {
parent = temp;
temp = temp.value > val ? temp.left : temp.right;
} while (temp != null);
if (parent.value > val) {
parent.left = node;
} else {
parent.right = node;
}
}
public void del(int val) {
Node temp = this.root;
Node parent = null;
while (temp != null && temp.value!=val) {
parent = temp;
temp = temp.value > val ? temp.left : temp.right;
}
if(temp == null) {
// 沒有找到val匹配的節(jié)點
return;
}
if(temp.left == null && temp.right == null) {
// 刪除葉子節(jié)點
if(parent == null) {
this.root = null;
return;
}
if(parent.left == temp) {
parent.left = null;
} else {
parent.right = null;
}
} else if(temp.left != null && temp.right != null) {
// 刪除有兩個子樹
// 找到右子樹中最小的節(jié)點侮繁,用最小節(jié)點的值替換當前節(jié)點的值拉宗,刪除最小的節(jié)點
Node minNode = temp.right;
Node minNodeParent = temp;
while (minNode.left!= null){
minNodeParent = minNode;
minNode = minNode.left;
}
temp.value = minNode.value;
if(minNodeParent.left == minNode) {
minNodeParent.left = null;
} else {
minNodeParent.right = null;
}
} else {
// 刪除只有一個子樹
if(parent.left == temp) {
parent.left = temp.left==null ? temp.right : temp.left;
} else {
parent.right = temp.left==null ? temp.right : temp.left;
}
}
}
public void perOrder() {
System.out.println();
perOrder(this.root);
System.out.println();
}
private void perOrder(Node node) {
if (node == null) {
return;
}
perOrder(node.left);
System.out.print(node.value+ " ");
perOrder(node.right);
}
class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" + "value=" + value + '}';
}
}
}
二叉排序樹
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門艇拍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐蜕,“玉大人,你說我怎么就攤上這事卸夕〔闶停” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵快集,是天一觀的道長贡羔。 經(jīng)常有香客問我,道長个初,這世上最難降的妖魔是什么乖寒? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮院溺,結(jié)果婚禮上楣嘁,老公的妹妹穿的比我還像新娘。我一直安慰自己珍逸,他們只是感情好逐虚,可當我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谆膳,像睡著了一般叭爱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上摹量,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼当凡!你這毒婦竟也來了山害?” 一聲冷哼從身側(cè)響起,我...
- 正文 年R本政府宣布槽唾,位于F島的核電站丧枪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏夏漱。R本人自食惡果不足惜豪诲,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挂绰。 院中可真熱鬧屎篱,春花似錦、人聲如沸葵蒂。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽践付。三九已至秦士,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間永高,已是汗流浹背隧土。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 參考資料:[1]http://www.cnblogs.com/skywang12345/p/3576373.htm...
- 一.課程設(shè)計題目及要求 (一)課程設(shè)計題目 用順序和二叉鏈表作存儲結(jié)構(gòu)實現(xiàn)二叉排序樹: (1)以回車('\n')為...
- 一絮重、滿二叉樹 除最后一層無任何子節(jié)點外届吁,每一層上的所有結(jié)點都有兩個子結(jié)點二叉樹错妖。或者說:一個二叉樹疚沐,如果每一個層的...
- 可以由一個線性輸入序列依照二叉查找樹的規(guī)則進行構(gòu)建 二叉查找樹的刪除比較復雜, 詳見: https://songl...
- 左子樹上所有結(jié)點的數(shù)據(jù)域均小于或等于根結(jié)點的數(shù)據(jù)域,右子樹上所有結(jié)點的數(shù)據(jù)域均大于根結(jié)點的數(shù)據(jù)域 查找操作: 由于...