public class BinarySortTree {
public Node root;
/**
* @param args
*/
public static void main(String[] args) {
int[] arrays = {12,1,33,21,14,27,13,16,23,29,25};
BinarySortTree tree = new BinarySortTree();
for (int i = 0; i < arrays.length; i++) {
tree.put(arrays[i]);
}
tree.deleteNode(21);
tree.deleteNode(23);
tree.middleTraversal(tree.getRoot());
}
private void deleteNode(int data){
if(root != null){
Node searchNode = searchNode(data);
if(searchNode != null){
if(searchNode.leftNode == null && searchNode.rightNode == null){
// 要刪除的節(jié)點是葉子節(jié)點
Node parent = searchNode.parent;
if(parent.leftNode == searchNode){
// 要刪除的節(jié)點在他父節(jié)點的左邊
parent.leftNode = null;
}else if(parent.rightNode == searchNode){
// 要刪除的節(jié)點在他父節(jié)點的右邊
parent.rightNode = null;
}
searchNode.parent = null;
}else if(searchNode.leftNode != null && searchNode.rightNode == null){
// 要刪除的節(jié)點有左節(jié)點沒有右節(jié)點,先判斷要刪除的節(jié)點在他父節(jié)點的左邊還是右邊
Node parent = searchNode.parent;
if(parent.leftNode == searchNode){
parent.leftNode = searchNode.leftNode;
}else if(parent.rightNode == searchNode){
parent.rightNode = searchNode.leftNode;
}
searchNode.leftNode.parent = parent;
searchNode.leftNode = null;
searchNode.rightNode = null;
}else if(searchNode.leftNode == null && searchNode.rightNode != null){
// 要刪除的節(jié)點有右節(jié)點沒有左節(jié)點,先判斷要刪除的節(jié)點在他父節(jié)點的左邊還是右邊
Node parent = searchNode.parent;
if(parent.leftNode == searchNode){
parent.leftNode = searchNode.rightNode;
}else if(parent.rightNode == searchNode){
parent.rightNode = searchNode.rightNode;
}
searchNode.rightNode.parent = parent;
searchNode.leftNode = null;
searchNode.rightNode = null;
}else if(searchNode.leftNode != null && searchNode.rightNode != null){
// 要刪除的節(jié)點左右都有節(jié)點,先判斷要刪除的節(jié)點在他父節(jié)點的左邊還是右邊
// 找到被刪除節(jié)點右子樹的最小節(jié)點掛到被刪的位置上
Node parent = searchNode.parent;
// 找右子樹的最小節(jié)點
Node smallestNode = searchNode.rightNode;
while(smallestNode.leftNode != null){
smallestNode = smallestNode.leftNode;
}
// 這個最小的節(jié)點如果存在右節(jié)點,把右節(jié)點放到該節(jié)點的位置
if(smallestNode.rightNode != null){
smallestNode.parent.leftNode = smallestNode.rightNode;
smallestNode.rightNode.parent = smallestNode.parent;
}else{
smallestNode.parent.leftNode = null;
}
smallestNode.leftNode = searchNode.leftNode;
searchNode.leftNode.parent = smallestNode;
if(smallestNode != searchNode.rightNode){
smallestNode.rightNode = searchNode.rightNode;
searchNode.rightNode.parent = smallestNode;
}
if(parent.leftNode == searchNode){ // 在左邊
parent.leftNode = smallestNode;
}else if(parent.rightNode == searchNode){ // 在右邊
parent.rightNode = smallestNode;
}
smallestNode.parent = parent;
searchNode.leftNode = null;
searchNode.rightNode = null;
searchNode.parent = null;
}
}
}
}
private static void middleTraversal(Node root){
if(root == null){
return ;
}
middleTraversal(root.leftNode);
System.out.println(root.data);
middleTraversal(root.rightNode);
}
private Node searchNode(int data){
if(root != null){
Node currentNode = root;
while(currentNode != null){
if(data == currentNode.data){
return currentNode;
}else if(data < currentNode.data){
currentNode = currentNode.leftNode;
}else if(data > currentNode.data){
currentNode = currentNode.rightNode;
}
}
}
return null;
}
private Node put(int data){
if(root == null){
Node node = new Node(data);
root = node;
return node;
}
Node currentNode = root;
while(currentNode!= null){
if(data == currentNode.data){
break;
}else if(data < currentNode.data){
if(currentNode.leftNode == null){
// 直接在左邊添加新的節(jié)點
Node newNode = new Node(data);
currentNode.leftNode = newNode;
newNode.parent = currentNode;
break;
}else{
currentNode = currentNode.leftNode;
}
}else if(data > currentNode.data){
if(currentNode.rightNode == null){
// 直接在右邊添加新的節(jié)點
Node newNode = new Node(data);
currentNode.rightNode = newNode;
newNode.parent = currentNode;
break;
}else{
currentNode = currentNode.rightNode;
}
}
}
return root;
}
static class Node{
public int data;
public Node leftNode;
public Node rightNode;
public Node parent;
public Node(int data){
this.data = data;
}
}
public Node getRoot(){
return root;
}
}
二叉排序樹
?著作權(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.遞歸的進行判斷。2.用中序遍歷判斷偿衰。后更:第一種方法實際上是錯誤的...
- 1 畫出對長度為10的有序表進行折半查找的判定樹挂疆,并求其等概率時查找成功的平均查找長度。 首先下翎,長度為n的有序表折...
- 概述 ??二叉排序樹又稱“二叉查找樹”缤言、“二叉搜索樹”。二叉排序樹:或者是一棵空樹视事,或者是具有下列性質(zhì)的二叉樹: ...