二叉排序樹

2021-10-01 11:18:19 字數 3629 閱讀 7410

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 ...