二叉搜尋樹

2021-10-22 09:33:02 字數 2157 閱讀 2383

二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹:

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