二叉樹21 二叉搜尋樹的第k個結點

2021-07-31 08:46:38 字數 1050 閱讀 6469

題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。

思路:這裡的第k大結點就是指按從小到大順序排列後的第k個結點。顯然題目很簡單,搜尋二叉樹按照中序遍歷就是乙個有序的序列,於是中序遍歷這個二叉樹,每次遍歷乙個結點記錄乙個計數器,當計算到count=k的結點就是所求的結點。可以使用遞迴或者迴圈來解決。使用遞迴時思考:如何在遞迴的同時記錄計數器?中序遍歷時,總是先處理左子樹—再處理中間結點即遍歷—再處理右子樹,因此每次在處理中間結點時進行計數即可。遞迴中如何當count==k時結束全部遞迴的呼叫而不需要遍歷全部的結點?

f1:當count==k時就及時return,那麼在本次遞迴呼叫過程中,在本層就不需要遍歷root的右子樹,直接返回到上一層,在上一層還是要判斷count==k,並且如果不滿足還是要執行this.process(root.right,k)來遍歷右子樹,即新增return後只是在本層中可以不用遍歷右子樹,在其他層還是要遍歷右子樹的,即還是要執行return後的**。例如上面的二叉樹中,如果k=2,那麼要查詢的結點時③,於是根據下面的程式,在遍歷到結點③時就return,於是結點③的右子樹不會遍歷,即結點④不會遍歷,但是之後的層次的右子樹還是會遍歷的,例如⑤的右子樹都會遍歷,此時遍歷結束後的count=6,即不用遍歷1個結點;如果k=4,那麼結點⑤是要查詢的結點,當遍歷到結點⑤時就return,於是結點⑤的右子樹都不會遍歷,此時遍歷完成後後count=4,即不用遍歷3個結點。

//給定一棵搜尋二叉樹找第k大結點,中序遍歷,遞迴,遍歷的同時進行計數

public class solution

//遞迴方法:找出二叉樹中序遍歷中的第k個值

private void process(treenode root,int k)

//③遍歷右子樹

this.process(root.right,k);}}

二叉樹 還原二叉樹 二叉搜尋樹

先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...

樹 二叉樹 二叉搜尋樹

給定乙個二叉樹,判斷其是否是乙個有效的二叉搜尋樹。假設乙個二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1 輸入 2 13輸出 true 示例 2 輸入 5 14 3 6輸出 false 解釋 輸入為 ...

排序二叉樹or搜尋二叉樹or查詢二叉樹

排序二叉樹,搜尋二叉樹,查詢二叉樹都是乙個意思,只是叫法不同而已。下面的文章中我們統稱為排序二叉樹。本文主要是針對高中資訊學,因此其中不涉及到指標,所有需要用指標的地方都直接使用陣列進行模擬。排序二叉樹定義 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子...