資料結構之二分搜尋樹增刪改查和遍歷實現

2021-08-26 08:43:47 字數 3736 閱讀 7614

是指一棵空樹或者具有下列性質的二叉樹:

1. 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;

2. 若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;

3. 任意節點的左、右子樹也分別為二叉查詢樹;

4. 沒有鍵值相等的節點。

public

class

treenode

extends

comparable

>

}

向乙個二分搜尋樹b中插入乙個節點node的演算法,過程為:

1. 若b是空樹,則將node所指結點作為根節點插入

2. 若插入的值e等於節點node.e,則不處理

3. 若插入的值e小於節點node.e,則把node所指節點插入到左子樹中

4. 若插入的值e大於節點node.e,則把node所指節點插入到右子樹中

public

void

add(e e)

private treenodeadd(treenodenode,e e)

if(e.compareto(node.e) < 0) else

if(e.compareto(node.e) > 0)

return node;

}

在二叉搜尋樹b中查詢e的過程為:

1. 若b是空樹,則搜尋失敗,否則:

2. 若e等於b的根節點的資料域之值,則查詢成功;否則:

3. 若e小於b的根節點的資料域之值,則查詢左子樹;否則:

4. 查詢右子樹。

1. 查詢乙個數在不在二分搜尋樹的節點中

private

boolean

find(treenodenode,e e)else

if(e.compareto(node.e) < 0) else

}2. 查詢二分搜尋樹中的最小元素

//查詢最小元素

public e findmin()

public treenodefindmin(treenodenode)

3. 查詢二分搜尋樹中的最大元素

//查詢最大元素

public e findmax()

public treenodefindmax(treenodenode)

刪除節點分三種情況

1. 刪除樹中最小元素 遞迴實現

/*** 刪除以node為根的二分搜尋樹中的最小的節點

* 返回刪除節點後新的二分搜尋樹的根

*@param node

*@return

*/private treenoderemovemin(treenodenode)

//否則把當前節點的左子樹繼續複製給節點的left

node.left = removemin(node.left);

return node;

}2. 刪除樹中最小元素 非遞迴實現

private e removeminnr(treenoderoot)

//當前節點的父節點的左還在用當前最小節點的右孩子代替

parent.left = current.right;

return current.e;

}3. 刪除樹中最大元素 遞迴實現

/*** 刪除以node為根的二分搜尋樹中的最大的節點

* 返回刪除節點後新的二分搜尋樹的根

*@param node

*@return

*/private treenoderemovemax(treenodenode)

node.right = removemax(node.right);

return node;

}4. 刪除樹中最大元素 非遞迴實現

private e removemaxnr(treenoderoot)

parent.right = current.left;

return current.e;

}5. 刪除樹中任意節點 遞迴實現

//刪除樹中的任意元素

public

void

remove(e e)

/*** 刪除樹中任意元素

*@param node

*@param e

*@return

*/private treenoderemove(treenodenode,e e)else

if(e.compareto(node.e) > 0)elseelse

if(node.right == null)else }}

6. 刪除樹中任意節點 非遞迴實現

/*** 刪除任意節點非遞迴實現

*@param e

*/public

void

removenr(e e)

private

void

removenr(treenodenode,e e)else

if(current == null) return;

}//找到了要刪除的節點

if(current.left == null)else

if(isleftchild)else

}else

if(current.right == null)else

if(isleftchild)else

}elseelse

if(isleftchild)else

}}

1. 前序遍歷 先根節點,再左子樹,然後右子樹

//前序遍歷

public

void

preorder()

private

void

preorder(treenode node)

2. 中序遍歷 先左子樹,再根節點,然後右子樹

//中序遍歷

public

void

inorder()

private

void

inorder(treenode node)

3. 後序遍歷 先左子樹,再右子樹,然後根節點

//後序遍歷

public

void

postorder()

private

void

postorder(treenode node)

//主要通過棧實現,首先把根節點入棧,然後根節點出棧,

//然後分別把根節點右子樹,左子樹入棧,因為先序遍歷是先根,再左後右,

//所以入棧時候應該是先右再左,棧的特點是先進後出,迴圈條件是棧不為空,

//首頁的節點都出棧後,棧肯定是空的

private

void preordernr(treenode root)

if(node.left !=

null)

}}

//通過佇列實現,佇列特點是先進先出,先把根節點入隊,然後分別把他的左右子樹入隊,

//迴圈條件是佇列不為空,遍歷完,佇列一定是空的,可以畫圖理解下

private

void levelorder(treenode node)

}}

主要還是要通過畫圖和實踐才能較好理解二叉排序樹

資料結構樹之二分查詢樹

二叉查詢樹 binary search tree 也稱有序二叉樹 ordered binary tree 排序二叉樹 sorted binary tree 是指一棵空樹或者具有下列性質的二叉樹 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 任意節點的右子樹不空,則右子樹上所有結...

演算法與資料結構之二分搜尋樹 BST

二分搜尋樹是一顆二叉樹,二分搜尋樹的每個節點的值 大於其左子樹的所有節點的值,小於其右子樹的所有節點的值,每一顆子樹也是二分搜尋樹,二分搜尋樹儲存的元素必須具有可比較性 二分搜尋樹的定義public class bstcomparable private node root private int ...

資料結構 二分搜尋樹(BST)

1.二分搜尋樹的簡單介紹 一般來講,二叉樹的儲存資料的基本結構是封裝乙個node節點,儲存左右兩個孩子的node變數,以及乙個泛型資料,二分搜尋樹需要泛型型別實現comparable介面 必須保證左子樹的資料比右子樹大 created by upupgogogo on 2018 5 30.上午11 ...