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

2021-08-20 08:59:30 字數 2687 閱讀 6832

1.二分搜尋樹的簡單介紹

一般來講,二叉樹的儲存資料的基本結構是封裝乙個node節點,儲存左右兩個孩子的node變數,以及乙個泛型資料,二分搜尋樹需要泛型型別實現comparable介面(必須保證左子樹的資料比右子樹大)

/**

* created by upupgogogo on 2018/5/30.上午11:38

*/public class bst>

}private int size; //二叉樹的節點個數

private node root; //當前二叉樹的根節點

public int getsize()

public boolean isempty()}

2.分析新增節點的方法

//新增乙個節點

public void add(e e)

private node add(node node, e e)

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

node.left = add(node.left, e);

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

node.right = add(node.right,e);

return node;

}

這裡通過遞迴演算法封裝了乙個add方法,兩個引數分別表示需要新增節點的二叉樹的根節點,以及需要儲存的資料,返回新增之後的二叉樹的根節點

首先判斷該節點是否為空,如果為空則返回乙個new node(e),如果不為空,判斷資料的大小,比根節點儲存資料小的話,把該資料新增到左子樹里(巨集觀的角度是整個左子樹),如果大於根節點儲存的資料,把該資料新增到右子樹里(巨集觀的角度是整個右子樹),資料相等不考慮新增,最後返回node

3.看二分搜尋樹是否包含元素e

public boolean contains(e e)

private boolean contains(node node, e e)

這裡通過遞迴演算法封裝了乙個contains方法,兩個引數分別表示當前是否包含元素e的二叉樹的根節點,和元素e,返回boolean型別資料

首先判斷當前二叉樹的根節點是否為空,如果為空表示當前二叉樹為空,則返回false,然後判斷該根節點所儲存的元素和引數e是否相等,相等則直接返回true,接著比較根節點所儲存元素和和元素e大小關係,比元素e大,則返回左二叉樹是否包含元素e,反之,則返回右二叉樹是否包含元素e

4.二叉樹的前中後序遍歷

// 二分搜尋樹的前序遍歷

public void preorder()

// 前序遍歷以node為根的二分搜尋樹, 遞迴演算法

private void preorder(node node)

// 二分搜尋樹的非遞迴前序遍歷

public void preordernr()

}// 二分搜尋樹的中序遍歷

public void inorder()

// 中序遍歷以node為根的二分搜尋樹, 遞迴演算法

private void inorder(node node)

// 二分搜尋樹的後序遍歷

public void postorder()

// 後序遍歷以node為根的二分搜尋樹, 遞迴演算法

private void postorder(node node)

5.刪除乙個節點

public void remove(e e)

private node remove(node node, e e)

if (node.right == null)

// 待刪除節點左右子樹均不為空的情況

// 找到比待刪除節點大的最小節點, 即待刪除節點右子樹的最小節點

// 用這個節點頂替待刪除節點的位置

node successor = new node(minimum(node.right).e);

size ++;

successor.right = removemin(node.right);

successor.left = node.left;

node.left = node.right = null;

size --;

return successor;

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

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

return node;

}

這裡通過遞迴演算法封裝了乙個remove方法,兩個引數分別表示當前需要刪除節點的二叉樹的根節點,和元素e,返回刪除後二叉樹的根節點

首先判斷根節點是否為空,如果為空則直接返回null,然後比較元素e和根節點所儲存元素的大小關係,如果想等,先考慮左子樹為空的情況,則返回右二叉樹的根節點,並且讓根節點所指向右孩子的變數為空,脫離整個二叉樹,右子樹為空也是一樣

當兩個子樹都不為空時,new 乙個node物件,儲存右子樹最小的元素e,並刪除右子樹該節點,讓這個新建的node節點右孩子指向被刪除根節點的右孩子,左孩子也是,並讓根節點的左右兩個孩子變數都指向null,脫離整個二叉樹

然後比較該元素和根節點所儲存元素的大小,如果大於該元素,則刪除左子樹所儲存該元素的節點,並返回刪除後的根節點

反之亦然

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

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

資料結構 二分搜尋樹篇

樹結構本身是一種天然的組織結構 二叉樹和鍊錶一樣,動態資料結構 class node二分搜尋樹 也是二叉樹 二分搜尋樹的每個節點的值 1.定義二分搜尋樹節點 public class bst private node root private int size public bst public i...

資料結構 二叉搜尋樹 BST

一棵二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數 節點的右子樹只包含大於當前節點的數 所有左子樹和右子樹自身必須也是二叉搜尋樹 若輸出二叉搜尋樹的中序遍歷序列,則這個序列是非遞減 非遞增 有序的 圖1 節點有 a,b,c,d,e,f,g 葉子結點 d,e,f,g 其中結點a又被稱為根節...