二叉排序樹概念 構造 插入 查詢 刪除

2021-10-05 01:55:59 字數 3989 閱讀 1617

1. 二叉排序樹介紹:

二叉排序樹(binary search tree,bst):在一棵二叉樹中,對於任何乙個非葉子節點而言,左子節點的值比其根節點的值小,右子結點比其根節點的值大。

對於二叉排序樹而言,它的查詢速度很快,類似二分查詢效率。

對於集合中而言:

1)若是未排序的陣列,優點:直接在陣列為新增資料,速度快。缺點:查詢的速度慢,且在插入時,可能需要對陣列擴容。

2)排序過的陣列,優點:可以利用二分查詢,查詢的速度快。缺點:在插入時,為了保證陣列有序,在新增新資料時,找到合適的位置時,需要整體移動該位置後面的資料,速度慢,且有擴容的需求。

3)鏈式儲存:不管鍊錶是否有序,優點:新增資料快,且不需要整體移動,不需要擴容。缺點:查詢速度慢。

4)二叉樹:排序二叉樹

2. 二叉排序樹的建立及遍歷

package binarysorttree;

public

class

binarysorttreedemo

; binarysorttree binarysorttree =

newbinarysorttree()

;for

(int i =

0; i < arr.length; i++

) system.out.

println

("二叉排序樹中序遍歷");

// 二叉排序樹的中序遍歷是按照 val 的值逐漸增大的

binarysorttree.

infixorder()

;}}// 二叉排序樹類

class

binarysorttree

else

}public

void

infixorder()

else}}

// 結點類

class

node

@override

public string tostring()

';}// 中序遍歷

public

void

infixorder()

system.out.

println

(this);

if(this

.right != null)

}// 新增結點

public

void

add(node node)if(

this

.val > node.val)

else

}else

else}}

}

3. 二叉排序樹的查詢結點 包括 查詢某個結點

二叉排序樹的刪除有三種情況需要考慮:1)刪除葉子結點(比如:2,5,9,12); 2)刪除只有一棵子樹的結點(比如:1); 3)刪除有兩棵子樹的結點(比如:7,3,10)

第一種情況:刪除葉子結點:

第二種情況:刪除的結點只有一棵子樹

如果 targetnode 有的是 右子節點:

第三種情況:刪除的是有兩棵子樹的結點:

**實現刪除

package binarysorttree;

public

class

binarysorttreedemo

; binarysorttree binarysorttree =

newbinarysorttree()

;for

(int i =

0; i < arr.length; i++

) system.out.

println

("二叉排序樹中序遍歷");

// 二叉排序樹的中序遍歷是按照 val 的值逐漸增大的

binarysorttree.

infixorder()

; binarysorttree.

delnode(1

);system.out.

println

("刪除結點:");

binarysorttree.

infixorder()

;}}// 二叉排序樹類

class

binarysorttree

else

}public

void

infixorder()

else

}// 封裝查詢方法

public node search

(int val)

else

}public node searchparent

(int val)

else

}// 刪除結點

public

void

delnode

(int val)

else

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

node parent =

searchparent

(val)

;// 因為在 else 裡邊說明在這棵樹中一定存在要刪除的結點,此時去查詢它的父節點,就只有 有、或者沒有的情況

// 如果沒有 父節點 —— 只可能是要刪除的是 根節點,刪除根節點與刪除targetnode 有兩棵子樹是一樣的步驟

// 情況一:刪除葉子結點:

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

else

if(parent.right != null && parent.right.val == val)

}else

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

else

else

}else

}else

else

}else}}

}}private

intdelrighttreemin

(node targetnode)

int tmp = node.val;

delnode

(tmp)

;return tmp;}}

// 結點類

class

node

@override

public string tostring()

';}// 中序遍歷

public

void

infixorder()

system.out.

println

(this);

if(this

.right != null)

}// 新增結點

public

void

add(node node)if(

this

.val > node.val)

else

}else

else}}

// 要實現刪除,不管是哪種情況,都要先在二叉樹中找到該結點

public node search

(int val)if(

this

.val > val)

}else

}return null;

}// 還有查詢 targetnode 的parent 結點

public node searchparent

(int val)

else

else

if(val >=

this

.val &&

this

.right != null)

else}}

}

二叉排序樹 插入 刪除 查詢

原本是想寫關於android分享功能的部落格,但是沒真機不好去測試,大白天的手機被3歲娃娃,拿去看少兒頻道了,關於二叉排序樹的定義是 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的...

二叉排序樹的查詢 插入 刪除

二叉排序樹的查詢 插入 刪除 何謂二叉排序樹 定義 二叉排序樹又稱二叉查詢樹,它或者是一顆空樹,或者是具有以下性質的二叉樹 1 若它的左子樹不空,則左子樹上所有節點的值均小於該節點的值。2 若它的右子樹不空,則右字樹上所有節點的值均大於該節點的值。3 它的左右子樹也分別為二叉排序樹。時間複雜度 o ...

二叉排序樹的查詢(插入 刪除)

近期逐步開始期末複習,在部落格上投入的精力將大幅減少大概一月左右!二叉樹的二叉鍊錶結點結構定義 typedef struct bitnodebitnode,bitree 遞迴查詢二叉排序樹t中是否存在key,指標f指向t的雙親,其初始呼叫值位null,若查詢成功,則指標p指向該資料元素結點,並返回t...