二叉排序樹(BST)

2021-10-08 03:50:17 字數 4152 閱讀 2122

1.基本介紹

對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明:如果有相同的值,可以將該節點放在左子節點或右子節點。

比如針對前面的資料 (7, 3, 10, 12, 5, 1, 9) ,對應的二叉排序樹為:

2.二叉排序樹建立和遍歷

3.二叉排序樹的刪除

二叉排序樹的刪除情況比較複雜,有下面三種情況需要考慮

刪除葉子節點 (比如:2, 5, 9, 12)

刪除只有一顆子樹的節點 (比如:1)

刪除有兩顆子樹的節點. (比如:7, 3,10 )

第一種情況:刪除葉子節點 (比如:2, 5, 9, 12)思路(1) 需求先去找到要刪除的結點 targetnode

(2) 找到targetnode 的 父結點 parent

(3) 確定 targetnode 是 parent的左子結點 還是右子結點

(4) 根據前面的情況來對應刪除

左子結點 parent.left = null

右子結點 parent.right = null;

第二種情況: 刪除只有一顆子樹的節點 比如 1思路(1) 需求先去找到要刪除的結點 targetnode

(2) 找到targetnode 的 父結點 parent

(3) 確定targetnode 的子結點是左子結點還是右子結點

(4) targetnode 是 parent 的左子結點還是右子結點

(5) 如果targetnode 有左子結點

5. 1 如果 targetnode 是 parent 的左子結點

parent.left = targetnode.left;

5.2 如果 targetnode 是 parent 的右子結點

parent.right = targetnode.left;

(6) 如果targetnode 有右子結點

6.1 如果 targetnode 是 parent 的左子結點

parent.left = targetnode.right;

6.2 如果 targetnode 是 parent 的右子結點

parent.right = targetnode.right

情況三 : 刪除有兩顆子樹的節點. (比如:7, 3,10 )

思路(1) 需求先去找到要刪除的結點 targetnode

(2) 找到targetnode 的 父結點 parent

(3) 從targetnode 的右子樹找到最小的結點

(4) 用乙個臨時變數,將 最小結點的值儲存 temp = 11

(5) 刪除該最小結點

(6) targetnode.value = temp

public

class

binarysorttreedemo

; binarysorttree binarysorttree =

newbinarysorttree()

;for

(int i =

0; i < arr.length; i++

) system.out.

println

("中序邊二叉排序樹:");

// 1, 2, 3, 5, 7, 9, 10, 12

binarysorttree.

infixorder()

;// binarysorttree.delnode(2);

// binarysorttree.delnode(5);

// binarysorttree.delnode(9);

// binarysorttree.delnode(12);

// binarysorttree.delnode(1);

// binarysorttree.delnode(7);

binarysorttree.

delnode(3

);binarysorttree.

delnode(10

);system.out.

println

("刪除結點之後:");

binarysorttree.

infixorder()

;}}//二叉排序樹

class

binarysorttree

else

}//中序遍歷

public

void

infixorder()

else

}//查詢要刪除的結點

public node searche

(int value)

else

}//查詢要刪除的結點的父節點

public node searchparent

(int value)

else

}/**

* 刪除已node為根節點的二叉排序樹的的最小結點,並返回該最小結點的值

* @param node

* @return

*/public

intdelrighttreemin

(node node)

//刪除

delnode

(temp.value)

;return temp.value;

}//刪除結點

public

void

delnode

(int value)

else

//如果當前二叉樹只有乙個節點

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

//否則直接返回

return;}

//找到需要刪除的結點的父節點

node parent =

searchparent

(value)

;//開始刪除結點

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

else

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

}else

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

else

else

}else

}else

else

}else}}

}}}//建立乙個node結點

class

node

@override

public string tostring()

';}//新增結點

public

void

add(node node)

//比較需要新增的結點的值和當前結點的值的關係

if(node.value <

this

.value)

else

}else

else}}

//中序遍歷

public

void

infixorder()

system.out.

println

(this);

if(this

.right != null)

}//根據結點的value值查詢結點

public node search

(int value)

elseif(

this

.value > value)

else

}else

else}}

//根據value查詢該元素的父節點

public node searchparent

(int value)

else

elseif(

this

.value < value &&

this

.right != null)

else}}

}

二叉排序樹BST

二叉排序樹 binary sort tree 又稱二叉查詢樹 binary search tree 亦稱二叉搜尋樹。二叉排序樹的性質 左子樹上所有結點的值均小於或等於它的根結點的值 右子樹上所有結點的值均大於或等於它的根結點的值 左 右子樹也分別為二叉排序樹 如圖是乙個bst。有了這種性質,bst的...

二叉排序樹 BST

二叉排序樹,又叫二叉查詢樹,它或者是一棵空樹 或者是具有以下性質的二叉樹 1.若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值 2.若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值 3.它的左右子樹也分別為二叉排序樹。1.1 排序二叉樹之插入操作 已知乙個關鍵字值為key的結...

BST(二叉排序樹)

二叉查詢樹 binary search tree 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。查詢二叉搜尋樹 遞...