二叉搜尋樹

2021-09-28 11:11:15 字數 3397 閱讀 9972

二叉搜尋樹

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 解釋 輸入為 ...