/**
* @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 的實現 二叉搜尋樹的定義 一棵二叉樹,可能為空 一棵非空的二叉搜尋樹滿足以下特徵 每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同,因此,所有的關鍵字都是唯一的。在根節點的左子樹中,元素的關鍵字 如果有的話 都小於根節點的關鍵字。在根節點的右子樹中,...