二叉排序樹

2021-10-08 17:46:40 字數 4347 閱讀 3066

二叉排序樹

思路:二叉排序樹的新增

1.1 將第乙個新增的作為根節點了

1.2 比當前遍歷的節點小的 新增到 左邊

1.3 比當前遍歷的節點大的 新增到 右邊

1.4 盡量不新增相同值得到二叉排序樹中,可以在新增的時候 if else 到預設右邊

二叉排序樹的遍歷

2.1 中序遍歷 : 從小到大

二叉排序樹的刪除

3.1 刪除分三種情況; 1. 刪除葉子節點(沒有左右子節點)2. 刪除帶有乙個子節點的 3. 刪除帶有兩個子節點的

3.2 準備

3.2.1 查詢需要被刪除的節點的方法

3.2.2 查詢需要被刪除的節點的父節點的方法 【重點】

3.2.3 查詢刪除節點的右子樹最小的節點。或者查詢左子樹最大節點。之後刪除該最小節點(葉子節點)【刪除帶有兩個子節點時用到】

3.3 如果找到了待刪除的節點, 額外判斷刪除是不是根節點。

("*****===分割線**********==");

bs.delnode

(new

bsnode(2

)); bs.

delnode

(new

bsnode(5

)); bs.

delnode

(new

bsnode(9

)); bs.

delnode

(new

bsnode(12

)); bs.

delnode

(new

bsnode(7

)); bs.

delnode

(new

bsnode(3

)); bs.

delnode

(new

bsnode(10

)); bs.

delnode

(new

bsnode(1

));// bs.delnode(new bsnode(2));

// bs.delnode(new bsnode(5));

// bs.delnode(new bsnode(9));

// bs.delnode(new bsnode(12));

// bs.delnode(new bsnode(1));

// bs.delnode(new bsnode(3));

// bs.delnode(new bsnode(7));

// bs.delnode(new bsnode(10));

bs.infixorder()

;}}class

binarysorttree

else

}/**

* 中序遍歷

*/public

void

infixorder()

root.

infixorder()

;}/** * 刪除具有左右子節點的節點時

* -找出右子樹最小的節點

* @return

*/public bsnode getmininright

(bsnode node)

// 跑去刪除節點的右子樹唄

bsnode rightnode = node.right;

// 起始位置

// 然後一直向左找最小,找到葉子節點

while

(rightnode.left != null)

// 刪除右子樹最小節點

delnode

(rightnode)

;return rightnode;

}/**

* 刪除節點

*/public

void

delnode

(bsnode node)

// 刪除

bsnode targetnode = root.

searchnode

(node);if

(targetnode == null)

if(root.left == null && root.right == null)

// 找父節點

bsnode parent = root.

nodeparent

(node)

;// 找到了刪除的節點、找到了刪除節點的父節點

// 刪除情況

if(targetnode.left == null && targetnode.right == null)

else

if(parent.right == targetnode)

}else

if(targetnode.left != null && targetnode.right != null)

else

else

}else

}else

else

}else}}

}}/** * 節點

*/class

bsnode

@override

public string tostring()

';}/**

* 新增節點

* @param node

*/public

void

add(bsnode node)

this

.left.

add(node);}

elseif(

this

.value < node.value)

this

.right.

add(node);}

}/**

* 中序遍歷

*/public

void

infixorder()

system.out.

println

(this);

if(this

.right != null)

}/**

* 查詢需要刪除的節點

*/public bsnode searchnode

(bsnode node)if(

this

.value == node.value)

elseif(

this

.value < node.value)

return

this

.right.

searchnode

(node);}

else

return

this

.left.

searchnode

(node);}

}/**

* 找到需要唄刪除的節點的父節點

* @param node 需要唄刪除的節點

* @return

*/public bsnode nodeparent

(bsnode node)

// 比較if(

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為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 ...