二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:
1.若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
2.若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
3.它的左右子樹也分別為二叉搜尋樹,不能放重複的元素
如下圖就是一顆二叉搜尋樹:
查詢插入如果是空樹,直接返回true
操作-刪除(難點)
設待刪除結點為 cur, 待刪除結點的雙親結點為 parent
一、cur.left == null
1. cur 是 root,則 root = cur.right
2. cur 不是 root,cur 是 parent.left,則 parent.left = cur.right
3. cur 不是 root,cur 是 parent.right,則 parent.right = cur.right
二、cur.right == null
1. cur 是 root,則 root = cur.left
2. cur 不是 root,cur 是 parent.left,則 parent.left = cur.left
3. cur 不是 root,cur 是 parent.right,則 parent.right = cur.left
三. cur.left != null && cur.right != null
需要使用替換法進行刪除,即在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被
刪除節點中,再來處理該結點的刪除問題
class
binarysearchtree
}public bsnode root = null;
public bsnode search
(int val)
else
if(cur.val < val)
else
}return null;
}public
boolean
insert
(int val)
bsnode cur = root;
bsnode parent = null;
//用來儲存cur的父親節點
//防止cur為空,時無法插入
while
(cur != null)
else
if(cur.val < val)
else
}//cur等於null退出迴圈
if(parent.val < val)
else
return
true
;//插入成功
}//刪除後,仍然是一顆二叉搜尋樹
public
void
remove
(int val)
}public
class
testdemo
system.out.
print
(root.val+
" ")
;preorder
(root.left)
;preorder
(root.right);}
public
static
void
inorder
(binarysearchtree.bsnode root)
inorder
(root.left)
; system.out.
print
(root.val+
" ")
;inorder
(root.right);}
public
static
void
main
(string[
] args)
catch
(nullpointerexception e)
}}
最優情況下,二叉搜尋樹為完全二叉樹,其平均比較次數為:log2n
最差情況下,二叉搜尋樹退化為單支樹,其平均比較次數為:n/2
問題:如果退化成單支樹,二叉搜尋樹的效能就失去了。
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...
樹 二叉樹 二叉搜尋樹
給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...