資料結構與演算法 二叉搜尋樹 及 常用操作

2021-07-26 20:20:37 字數 2014 閱讀 4463

/**

* @author miracle

* bst是一棵二叉樹,具有如下性質,對於任意乙個結點p,左子樹的任意乙個節點都小於p,右子樹的任意乙個結點都大於p。

* 當然也有定義加上等於,但是這裡不考慮等於,問題會簡化,參照leetcode的定義。

*/class treenode

}/**

* @author miracle

* 關於bst的常用操作,主要有insert,delete,successor,preccessor,min,max。在solution類裡面依次實現。

* 以上操作都是o(h)的,在平均情況下,h是ologn的。

*/public class solution

/*** @param root

* @param p

* @return

* 在root子樹裡面找出p的後繼節點,可以從兩個方面來理解這裡的後繼。第乙個是按排序,第乙個比p大,這個是和中序遍歷結果一致。

* 另乙個是按照操作的角度,如果p沒有右子樹,那麼返回它的最近的右邊的父節點,否則就是右子樹的最左。可以發現,子樹的肯定最小。

* 這個方法的實現就是按照這個思路來的。那麼為了得到上乙個左邊的父節點,這裡使用乙個pre引用。

* 找前驅思路一樣,只不過正好相反。

*/public treenode succeesor(treenode root, treenode p)

elseelse

return pre;

}} return null; }

/*** @param root

* @param p

* @return

* 在root樹內加入乙個p節點,而且滿足bst的性質。思路是先搜尋p,如果發現p返回,否則一定會找到乙個null,然後null的父節點下面新增p。

* 所以這裡也要用到乙個pre引用。

*/public treenode insert(treenode root, treenode p)

if(pre == null)

return p;

if(pre.val > p.val)

pre.left = p;

else

pre.right = p;

return root; }

/*** @param root

* @param k

* @return

* 在root樹內刪除val為k的節點,bst的性質不改變。

* 這裡我是參照leetcode的乙個例子完成的,delete函式的職責是在root內刪除k,然後返回新的樹。如何實現這個函式?

* 先看root是否等於k,如果等於,那麼看root是否有子樹,如果沒有子樹,那麼直接返回null,如果只有左子樹,那麼返回

* 左子樹,如果只有右子樹那麼返回右子樹,如果都有,那麼把右子樹的最左邊的值賦給root,再刪除右子樹的最左邊。

* 如果root不等於k,那麼這裡就涉及遞迴了,需要返回root,而且修改root的引用,左子樹設定為遞迴處理左子樹以後的返回值,

* 右子樹一樣。如果root為null,這也是有可能的,那麼就返回null。

*///遞迴在形式上是自己呼叫自己,乙個遞迴函式有雙重視角,第一種是return視角,就是最基本的情況,返回值情況,不需要遞迴地呼叫的情況。另一種是需要遞迴地更加一般化的處理,通常來講是先做一些處理,再來遞迴處理乙個更小規模的情況,我們需要做的是讓return的特殊情況能夠被我們的一般情況使用。這樣就可以接軌,完成遞迴。

public treenode delete(treenode root, int k)else if (root.right == null) else

} root.left = delete(root.left, k);

root.right = delete(root.right, k);

return root; }

public static void main(string args )

}

資料結構與演算法問題 二叉搜尋樹

詳細實現了二叉查詢樹的各種操作 插入結點 構造二叉樹 刪除結點 查詢 查詢最大值 查詢最小值 查詢指定結點的前驅和後繼 它或者是一棵空樹 或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 3 左 右...

資料結構與演算法問題 二叉搜尋樹

具體實現了二叉查詢樹的各種操作 插入結點 構造二叉樹 刪除結點 查詢 查詢最大值 查詢最小值 查詢指定結點的前驅和後繼 它或者是一棵空樹 或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上全部結點的值均小於它的根結點的值。2 若右子樹不空。則右子樹上全部結點的值均大於它的根結點的值 3 左 右...

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

看到有個傢伙寫的很好 二叉查詢樹 二 之 c 的實現 二叉搜尋樹的定義 一棵二叉樹,可能為空 一棵非空的二叉搜尋樹滿足以下特徵 每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同,因此,所有的關鍵字都是唯一的。在根節點的左子樹中,元素的關鍵字 如果有的話 都小於根節點的關鍵字。在根節點的右子樹中,...