二叉樹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 樹可以分為幾個...