二叉搜尋樹非遞迴實現 java版

2021-08-15 12:32:54 字數 3056 閱讀 5893

二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹:

若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

它的左、右子樹也分別為二叉排序樹。

其實說白點就是一顆二叉樹滿足了左子節點小於根節點元素,右子節點大於根節點元素,這樣的二叉樹就是二叉搜尋樹,二叉搜尋樹實現符號表,具有插入、查詢的高效性,對其優化可以生成平衡二叉樹,紅黑樹等更高效的查詢和插入資料結構,是乙個優秀的基礎演算法。

看下其資料的結構

這是乙個簡單的二叉搜尋樹結構,滿足了基本的需求

class node

}

看下樹中方法涉及到插入、查詢、刪除基本操作

class tree

//插入元素

public

void

insert(int key,int

value)

//刪除元素

public

void

delete(int key)

//返回node下最小節點

public node min(node node)

//刪除該節點下的最小節點

public

void

deletemin(node node)

//刪除該節點下最大節點

public

void

deletemax(node node)

}

查詢操作和二分查詢類似,將key和節點的key比較,如果小於,那麼就在left node節點查詢,如果大於,則在right node節點查詢,如果相等,直接返回value。

public node find(int key)

}return currentnode;

}

插入過程非常簡單,很類似與二叉樹搜尋樹的查詢過程。當需要插入乙個新結點時,從根節點開始,迭代或者遞迴向下移動,直到遇到乙個空的指標nil,需要插入的值即被儲存在該結點位置。

public

void

insert(int key,int

value)

//比較左右節點元素,從root開始

node parentnode=root;//當前元素父元素

node currentnode=root;//當前元素

while(currentnode!=null)else

}if(key//插入元素

system.out.println(parentnode.key+"的左邊可以插入"+key);

parentnode.left=new node(key,value);

}else

}

返回該節點最小節點,就是一直遍歷往左遍歷直到找到其左子節點為空那麼當前節點就是最小的。

public node min(node node)

return currentnode;

}

刪除元素操作在二叉樹的操作中應該是比較複雜的。首先來看下比較簡單的刪除最大最小值得方法。

以刪除最小值為例,我們首先找到最小值,及最左邊左子樹為空的節點,然後返回其右子樹作為新的左子樹。

public

void

deletemin(node node)

parentnode.left=currentnode.right;

currentnode.right=null;

}public

void

deletemax(node node)

parentnode.right=currentnode.left;

currentnode.left=null;

}

刪除的一般情況,上述刪除最大和最小只是兩個特殊情況,有了上面做鋪墊下面的就好理解點,首先我們需要找到待刪除節點的左子樹上的最大值節點,或者右子樹上的最小值節點(t.hibbard提出的一種解決方法),然後將該節點的引數值與待刪除的節點引數值進行交換,最後刪除該節點,這樣需要刪除的引數就從該二叉樹中刪除了。需要注意的是刪除後的一些引用該置為null的一定要置為null好讓其被**。

public void delete(int key)else

}system.out

.println("要刪除的是:"+currentnode.key);

system.out

.println("父親是:"+parentnode.key);

// 要替換刪除元素的node

node exnode=min(currentnode.right);

system.out

.println("與其替換的是:"+exnode.key);

//找到其右節點中最小節點用以替換要刪除的節點

if(parentnode.key>key)else

deletemin(currentnode.right); //刪除原引用

if(exnode!=null)

currentnode.left=null;

currentnode.right=null;

}

中序遍歷,其他遍歷也差不多,不多講

public

void

inorder(node rootnode)

}

下面測試一下,這是測試**

依據** 提示,可以自己手動輕鬆畫出這棵二叉樹,具體可自己實踐。目前實現的這個版本不可插入重複元素,其實如果要插入重複元素,只需在插入操作中找到這個元素,更新即可。做下**相應修改就好

二叉搜尋樹(遞迴 非遞迴)

完整源 在此 1 二叉搜尋樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹。若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 若它的右子樹不為空,則右子樹上所有的節點的值都大於根節點的值 它的左右子樹也分為二叉搜尋樹 此二叉樹的中序遍歷結果為 0,1,2,3...

二叉搜尋樹 非遞迴)

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

非遞迴實現搜尋二叉樹

include using namespace std template struct binarysearchtreenode template class binarysearchtree binarysearchtree binarysearchtree bstree bsnode opera...