二叉搜尋樹
1.概念
二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹**,或者是具有以下性質的二叉樹:
若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值
若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值
它的左右子樹也分別為二叉搜尋樹。
2.查詢
3.插入
4.刪除
設待刪除結點為 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 需要使用替換法進行刪除,即在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題。
示例:
//和類關聯的方法用static
public
class
binarysearchtree
}private node root=null;
/** * 查詢
* 在搜尋樹中查詢key,如果找到則返回key所在的節點,否則返回null
* @param key
* @return null
*/public node search
(int key)
else
if(key
else
if(key>cur.key)
}return null;
}/**
* 插入
* @param key
* @return true表示插入成功,false表示插入失敗
*/public
boolean
insert
(int key)
node cur=root;
node parent=null;
while
(cur!=null)
else
if(key
else
if(key>cur.key)
} node node=
newnode
(key);if
(key
else
if(key>parent.key)
return
true;}
/** * 刪除成功返回true,刪除失敗返回false
* @param key
* @return
*/public
boolean
remove
(int key)
else
if(key
else
if(key>cur.key)
}return
false;}
private
void
removenode
(node parent,node cur)
else
if(parent.left==null)
else
if(parent.right==null)
}else
if(cur.right==null)
else
if(parent.left==null)
else
if(parent.right==null)
}else
cur.key=goat.key;
if(goat==goatparent.left)
else}}
public
static
void
main
(string[
] args)
;for
(int key:keys)
system.out.
println
("插入重複資料");
system.out.
println
(tree.
insert(7
)); system.out.
println
("前序遍歷:");
preorder
(tree.root)
; system.out.
println()
; system.out.
println
("中序遍歷:");
inorder
(tree.root)
; system.out.
println()
; system.out.
println
(tree.
search(7
).key)
; system.out.
println
(tree.
search(8
).key)
; system.out.
println
(tree.
search(5
).key);}
private
static
void
preorder
(node node)
}private
static
void
inorder
(node node)
}}
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 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 解釋 輸入為 ...