54 二叉搜尋樹的第k大節點

2021-10-21 19:28:32 字數 2259 閱讀 3424

給定一棵二叉搜尋樹,請找出其中第k大的節點。

示例 1:

輸入: root =[3

,1,4

,null,2]

, k =13

/ \ 1

4 \

2輸出:4

示例 2:

輸入: root =[5

,3,6

,2,4

,null,null,1]

, k =35

/ \ 3

6/ \

24/1輸出:

4

限制:二叉搜尋樹中序遍歷就是有序的,故中序遍歷後取出倒數第k個元素即可。

這裡介紹一下序列中倒數第k個數的計算。不總結的話,有時候不小心就出錯了。

倒著數的第k個元素,是順著數的第n - k + 1個元素,n表示元素總個數,原因是共n個數,那麼倒數第k個前面還有n - k個元素,則順著數應該是n - k + 1,又因為下標是從0開始的,故第n - k + 1個元素的下標是n - k。舉例如圖:

//中序遍歷

由於題目中給定的二叉搜尋樹,所以可以直接中序遍歷然後拿到倒數第k個元素即可。但如果給定的是一棵普通的樹呢?那麼沒有了中序遍歷後便是有序列表的性質,我們就不能用解法一了,故這裡再介紹乙個更通用的解法,使用小頂堆

無論用前序、中序、後序遍歷都行,能遍歷完樹的所有節點就可以。為了和解法一統一,我們這裡也選中序遍歷

遍歷到當前節點時,直接加入小頂堆,但當堆中的元素大於k個時,就彈出堆頂元素,即讓堆中最多保留k個元素,那麼遍歷結束後,堆中就剩下k個元素,且堆頂的就是我們要的第k大的元素。

劍指offer中有關使用堆的題還有兩個:

40. 最小的k個數

41. 資料流中的中位數

解法二可能效率比解法一低一些,但是解法二更通用。且很多時候遇到第k個xx字眼的場景時,我們基本第一反應都是用來做的,因為通用呀,0.0。

54 二叉搜尋樹的第k大節點

給定一棵二叉搜尋樹,請找出其中第k大的節點。示例 1 輸入 root 3,1,4,null,2 k 1 3 1 4 2 輸出 4 示例 2 輸入 root 5,3,6,2,4,null,null,1 k 3 5 3 6 2 4 1輸出 4限制 題解 中文力扣中的題意和書上的不太一致,書上是輸出從小到...

二叉搜尋樹 BST 的第k大節點

給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,5 3 7 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。利用bst中序有序的性質 coding utf 8 class treenode def init self,x self.val x self.left none self.r...

劍指 Offer 54 二叉搜尋樹的第k大節點

給定一棵二叉搜尋樹,請找出其中第k大的節點。方法一 中序遍歷,然後取值 二叉搜尋數中序遍歷的結果就是乙個有序陣列,演算法也很容易寫。這裡使用了arraylist類 definition for a binary tree node.public class treenode class soluti...