package ten;
/* * 二叉排序樹包括
* 1.建立樹時的增加節點
* 2.刪除節點(重點)
* 3.中序遍歷的結果其實就是排好序的
*/public
class
binarysorttreetest
; binarysorttree tree=
newbinarysorttree()
;for
(int i =
0; i < number.length; i++
) tree.
infixorder()
;}}class
binarysorttree
del(temp.data)
;return temp.data;
}/**
* 這個方法就是要刪除結點了,分為幾種情況
* 1.就是刪除不存在,直接跳出
* 2.就是刪除的結點就是根結點,而且這顆樹就只有根節點,直接刪除根節點
* 3.就是刪除的結點沒有孩子結點,就是葉結點
* 4.就是刪除的結點有兩個孩子的結點
* 5.最後就是刪除的結點有乙個孩子的結點
* 上面的邏輯順序是不能交換的,因為判斷了1才可以執行下面
* 判斷了2才可以放心執行3,不然下面可能報空指標異常,因為父節點不存在
* 然後再判斷兩個孩子的,最後乙個孩子的.
* 為什麼乙個孩子的放在最後判斷呢,就是因為只有乙個孩子的結點很難判斷出來
* 因為只有乙個孩子,可能是左孩子,可能是右孩子,判斷起來很麻煩,所以我們就
* 應該找它的對立事件,就是除了上面的情況,剩下的就是只剩下有乙個孩子結點的了
* @param data
*/public
void
del(
int data)
if(root.left==null&&root.right==null)
binarysortnode parent = root.
findparent
(data)
;//葉結點
if(temp.right==null&&temp.left==null)
if(parent.left!=null&&parent.left.data==data)
}//兩個孩子結點
else
if(temp.right!=null&&temp.left!=null)
/* * 現在就是剩下乙個結點的了,將情況分為
* 1.它是有左孩子
* 1.1它是它父節點的右孩子
* 1.2它是它父節點的左孩子
* 1.3沒有父節點,本身就是root
* 2.它有右孩子
* 2.1它是父節點的右孩子
* 2.2它是父節點的右孩子
* 2.3沒有父節點,本身就是root
*/else
else
}else
}else
if(temp.left!=null)
else
}else}}
}//尋找要刪除的結點
public binarysortnode find
(int data)
return root.
find
(data);}
//尋找要刪除的父節點
public binarysortnode findparent
(int data)
return root.
findparent
(data);}
/** * 增加節點
* @param node
* 思路:
* 如果根節點都是空的,證明樹是空的,所以直接增加在根節點上
* 否則就呼叫根節點的add方法
*/public
void
add(binarysortnode node)
else
}//中序遍歷
public
void
infixorder()
root.
infixorder()
;}}class
binarysortnode
/** * 查詢要刪除節點的父節點
* @param data
* @return
* 這個開始複雜一點點,解釋一下吧(其實和增加節點差不多)
* 1.首先判斷當前節點是不是要刪除節點的父節點
* 判斷條件就是當前節點的右孩子或者左孩子是要刪除節點
* 判斷之前得看下它的左孩子或者右孩子是不是空,不然會報空指標異常
* 2. 就是判斷要查詢刪除得節點的值是小還是大,決定向左還是有遞迴
* 遞迴的條件也要加上它的左孩子或者右孩子不是空值才行,不然報錯
* 3.這裡就要多一步了,就是找不到的條件,
* 就是,如果它的左孩子不是空值,但是要查詢的值又小於它,所以就找不到
* 右邊同樣的道理
*/public binarysortnode findparent
(int data)
elseif(
this
.data>data &&
this
.left!=null)
elseif(
this
.datathis
.right!=null)
else
}/**
* 查詢到要刪除的節點
* @param data
* @return
*/public binarysortnode find
(int data)
elseif(
this
.data>data)
return
this
.left.
find
(data);}
else
return
this
.right.
find
(data);}
}/**
* 增加節點
* @param node
* 按照思路就是這樣
* 1.如果當前得節點不是空的就進行新增,否則直接返回
* 2.因為新增要滿足二叉排序樹的要求,左孩子小於父節點,右孩子要大於父節點
* 3.因為可以呼叫這個方法證明當前節點肯定是存在的,所有直接和它的孩子進行比較
* 4.如果小的,就看左孩子是不是空的,空的就直接掛上去,不是空的就向左遞迴
* 5.如果大的,方法和上面類似
*/public
void
add(binarysortnode node)
else
}else
else}}
}//中序遍歷(這就不解釋了,看書)
public
void
infixorder()
system.out.
print
(this
.data+
" ");
if(this
.right!=null)
}}
二叉排序樹
在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...
二叉排序樹
name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...
二叉排序樹
include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...