給定一棵二叉搜尋樹,請找出其中第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...