二叉排序樹:bst: (binary sort(search) tree), 對於二叉排序樹的任何乙個非葉子節點,要求左子節點的值比當前節點的值小,右子節點的值比當前節點的值大。
特別說明:如果有相同的值,可以將該節點放在左子節點或右子節點。
比如針對資料 (7, 3, 10, 12, 5, 1, 9) ,對應的二叉排序樹為:
二叉排序樹的刪除情況比較複雜,有下面三種情況需要考慮
刪除葉子節點 (比如:2, 5, 9, 12)
刪除只有一顆子樹的節點 (比如:1)
刪除有兩顆子樹的節點. (比如:7, 3,10 )
刪除的節點是葉子節點,即該節點下沒有左右子節點。
思路
(1) 需求先去找到要刪除的結點 targetnode
(2) 找到targetnode 的 父結點 parent (考慮是否存在父節點)
(3) 確定 targetnode 是 parent的左子結點 還是右子結點
(4) 根據前面的情況來對應刪除
左子結點 parent.left = null
右子結點 parent.right = null;
思路
(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
思路
(1) 需求先去找到要刪除的結點 targetnode
(2) 找到targetnode 的 父結點 parent
(3) 從targetnode 的右子樹找到最小的結點
(4) 用乙個臨時變數,將 最小結點的值儲存 temp
(5) 刪除該最小結點
(6) targetnode.value = temp
//建立node結點
class node
//查詢要刪除的結點
/***
* @param value 希望刪除的結點的值
* @return 如果找到返回該結點,否則返回null
*/public node search(int value) else if(value < this.value)
return this.left.search(value);
} else
return this.right.search(value);
} } //查詢要刪除結點的父結點
/***
* @param value 要找到的結點的值
* @return 返回的是要刪除的結點的父結點,如果沒有就返回null
*/public node searchparent(int value) else else if (value >= this.value && this.right != null) else
} }
@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) }
}
//建立二叉排序樹
class binarysorttree
//查詢要刪除的結點
public node search(int value) else }
//查詢父結點
public node searchparent(int value) else }
//編寫方法:
//1. 返回的 以node 為根結點的二叉排序樹的最小結點的值
//2. 刪除node 為根結點的二叉排序樹的最小結點
/***
* @param node 傳入的結點(當做二叉排序樹的根結點)
* @return 返回的 以node 為根結點的二叉排序樹的最小結點的值
*/public int delrighttreemin(node node)
//這時 target就指向了最小結點
//刪除最小結點
delnode(target.value);
return target.value; }
//刪除結點
public void delnode(int value) else
//如果我們發現當前這顆二叉排序樹只有乙個結點
if(root.left == null && root.right == null)
//去找到targetnode的父結點
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 }}
} }
//新增結點的方法
public void add(node node) else
} //中序遍歷
public void infixorder() else
}}
資料結構 二叉排序樹(BST)
基本介紹 示例 public class binarysorttreedemo int arr binarysorttree binarysorttree newbinarysorttree for int item arr binarysorttree.infixorder node node b...
資料結構 二叉排序樹BST初探
首先給出二叉排序樹 binary sort tree 的定義 一棵二叉排序樹或者是一棵空樹或者滿足以下條件 1 若它的左子樹不為空,則左子樹所有節點的值均小於根的值 2 若它的右子樹不為空,則右子樹所有節點的值均大於根的值 3 左右子樹本身又分別是二叉排序樹 如下圖就是乙個二叉排序樹 繪畫水平真的就...
資料結構課設 BST二叉排序樹
程式設計實現二叉排序樹的建立 插入 刪除和查詢 對於給定的這組數在二叉排序樹上進行查詢,給出兩種情況下的查詢成功和不成功時的asl bst include using namespace std const int maxn 1e5 typedef struct node bsnode,bstree...