二叉樹BST的實現

2021-10-24 01:21:45 字數 3963 閱讀 4445

二叉樹bst的實現

(01) 若任意節點的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;

(02) 任意節點的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;

(03) 任意節點的左、右子樹也分別為二叉查詢樹。

(04) 沒有鍵值相等的節點(no duplicate nodes)。

1.遍歷

public

class

bstree

comparable

,value>

}public

intsize()

public

intsize

(node x)

一、遍歷

* 遍歷

* (1)若二叉樹非空,訪問根結點

* (2)遍歷左子樹

* (3)遍歷右子樹

* 前序遍歷的特點

* 第乙個數是根結點

* 第乙個比第乙個數小的數是根結點的左結點,那一堆比第乙個數小的是左子樹

* 第乙個比第乙個數大的數是根結點的右結點,那一堆比第乙個樹大的是右子樹

* 以此遞迴可以畫出原二叉樹

public

void

preorder

(node x)

public

void

preorder()

中序遍歷

後序遍歷

public

void

postorder()

public

void

postorder

(node x)

}

二、查

遞迴的思路

* 1.當x為null 的時候就是沒有,找不到

* 2.縮小問題規模

* 當只有乙個根結點和乙個左子結點乙個右子結點三個結點的時候

* 如果根結點就是要找到那個cmp==0,返回根結點的值

* 如果cmp>0,要找到比根結點大,那麼return (get一遍的返回),判斷右結點存在與否是否等於根節點

* 如果cmp<0,要找到比根結點小,返回return (get一遍的返回),判斷左結點存在與否是否等於根節點

public value get

(key key)

public value get

(node x,key key)

三、插

關於這裡呼叫的理解

* 1.呼叫時 一步一步往下搜尋,從樹根到樹底

* 2.呼叫完了後,乙個乙個關閉時,從那個插入的樹底到樹頂,計算每個結點的子結點個數,以此類推

** 這裡的遞迴

* 1.當x==null的時候return 乙個新節點就是這個插入的結點

* 2.縮小問題的規模

* 假如這個數只有根結點乙個結點

* 大於根結點,則讓右結點為新插入的結點,小於根結點則讓左結點為新插入的結點

* x.n就等於左結點的結點數+右結點的結點數+1;

* return x;

public

void

put(key key,value value)

public node put

(node x,key key,value val)

四、最大最小值

/1.最小值

遞迴思路

縮小問題規模+何時return。

假設只有根結點和乙個左孩子,乙個右孩子,共三個結點,易知,左結點為空則return 根節點的值

左結點不為空則return 左結點的值

2.最大值

遞迴思路

縮小問題規模+何時return。

假設只有根結點和乙個左孩子,乙個右孩子,共三個結點,易知,右結點為空則return 根節點的值

右結點不為空則return 右結點的值

public key min()

public node min

(node x)

public key max()

public node max

(node x)

public node floor

(node x,key key)

if(cmp==0)

return x;

node t=

floor

(x.right,key);if

(t!=null)

return t;

return x;

}public key celling

(key key)

public node celling

(node x,key key)

if(cmp==0)

return x;

node t=

celling

(x.left,key);if

(t!=null)

return t;

return x

六、刪除思路

* 何時return+縮小問題規模

* 如果有乙個根結點,乙個左孩子,乙個右孩子。一共三個結點。

* 最小值一定在左孩子這邊,一直查左孩子,直到左孩子為空的時候,為了讓左孩子與根結點斷開,那麼讓根結點的右孩子變成左孩子

* 即如果x.left==null,return x.right;

* 左結點不為空,繼續查x.left=deletemin(x.left); 最後return x;

* 這裡還涉及到,呼叫一層層關閉的時候是在往上走,那麼結點的個數就會重新計算。

**2.刪除最大值

* 同理

* 當右結點為null的時候,返回左結點

*

public

void

deletemin()

public node deletemin

(node x)

public

void

deletemax()

public node deletemax

(node x)

3刪除任意結點

** 思路:

* 1.找

* 2.只有乙個子結點

* 像刪除最大最小值那個一樣

* x.right為ull return x.left

* x.left為null return x.rigt

* 若左右連線都存在

* (1)將即將被刪除的結點鏈結儲存為t

* (2)將x指向它的後繼結點min(t.right),關於後繼結點就是要替代原來t結點的位置,那麼那個後繼結點一定在t的右鏈結且一定是右鏈結裡面最小的那個結點。為什麼呢?因為後繼結點x要大於t.left的所有結點,小於t.right的所有結點,這是固定的插入時候的順序。

* (3)x的右鏈結指向deletemin(t.right),後繼結點的右鏈結就是原本的右鏈結刪掉最小值後的鏈結

* (4)x的左鏈結指向原本的左鏈結。x.left=t.left;

*

public

void

delete

(key key)

public node delete

(node x,key key)

x.n=

size

(x.left)

+size

(x.right)+1

;return x;

}

BST 線索二叉樹實現

binarysearchtree.h 1 ifndef binarysearchtree h 2 define binarysearchtree h 34 include 5 include 6 using namespace std 78 template 9 class bst 1011 tem...

改造二叉樹(bst)

題目大意 給你一棵二叉樹,讓你改變最少的結點上的數值,使這棵二叉樹變成bst,求這個需要改變的最少的結點數。演算法 二分 dp 一開始就沒理解題目問的真正內涵,想了半天的樹型dp,結果肯定是果斷不對,看了題解才知道bst就是二叉樹中序遍歷之後保持有序,進一步得知其實就是要我們求lis。將這棵二叉樹中...

查詢二叉樹(BST)

今天分享一些關於bst的內容 一 基礎知識點 1 一棵樹最上面的節點稱為根節點,如果乙個節點下面連線多個節點,那麼該節點稱為父節點,它下面的節點稱為子節點。乙個節點可以有0個 1個 或多個子節點,沒有任何子節點的節點稱為葉子節點 2 以某種特定的順序訪問樹中所有的節點稱為樹的遍歷 3 樹可以分為幾個...