1.基本介紹
對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。特別說明:如果有相同的值,可以將該節點放在左子節點或右子節點。2.二叉排序樹建立和遍歷比如針對前面的資料 (7, 3, 10, 12, 5, 1, 9) ,對應的二叉排序樹為:
3.二叉排序樹的刪除
二叉排序樹的刪除情況比較複雜,有下面三種情況需要考慮
刪除葉子節點 (比如:2, 5, 9, 12)
刪除只有一顆子樹的節點 (比如:1)
刪除有兩顆子樹的節點. (比如:7, 3,10 )
第一種情況:刪除葉子節點 (比如:2, 5, 9, 12)思路(1) 需求先去找到要刪除的結點 targetnode第二種情況: 刪除只有一顆子樹的節點 比如 1思路(1) 需求先去找到要刪除的結點 targetnode(2) 找到targetnode 的 父結點 parent
(3) 確定 targetnode 是 parent的左子結點 還是右子結點
(4) 根據前面的情況來對應刪除
左子結點 parent.left = null
右子結點 parent.right = null;
(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 又 二叉搜尋樹,二叉排序樹 它或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉排序樹。查詢二叉搜尋樹 遞...