資料結構與演算法 二叉排序樹 BST

2021-10-08 02:56:04 字數 3611 閱讀 3273

二叉排序樹: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...