Leetcode - 230. Kth Smallest Element in a BST

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note:
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?


[qestion](https://leetcode.com/problems/kth-smallest-element-in-a-bst/#/description , question)

解法:

  1. 通過in-order排序將node變成一個array arr[k]就會是答案
    while薇芝, 在follow up 里面焕阿,出現(xiàn)的問題在于如果頻繁的isnert和delete的話時間上就hold不住,每次insert or add之后都會出現(xiàn)需要重新in order的問題洁灵,假設我們insert n次,那么我們的時間總長就會變成n2,which is pretty bad

2.我使用的是這個解法掺出,只是個思路徽千,但是確實可行,需要改變binary tree的結構實現(xiàn)

class Solution(object):
    def totalnode(self,root):
        if not root.right and not root.left:
            return 1
        else:
            l,r = 0, 0
            if node.right:
                r = self.totalnode(node.right)
            if node.left:
                l = self.totalnode(node.left)
            return 1+l + r

    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        if k == 0:
            return root.val
        l = 0
        if root.left:
            l = self.totalnode(l)

        if k ==  l+1:
            return root.val
        if k > l+1:
            return kthSmallest(self, root.right, k-l+1)
        else:
            return kthSmallest(self, root.right, k-1)

簡單來說用total-node function來計算某棵樹總共有多少node汤锨,
先計算左邊總共有多少node双抽,如果k > lefttotal,那么說明k在樹杈的右邊,反之就說明他在樹叉的左邊闲礼,但這樣的時間復雜度相當?shù)母咧笖?shù)性的牍汹,

但是,如果改變binary tree的結構的話柬泽,就能夠讓他的time complexity壓縮到n慎菲,

具體:
正常的tree

struct tree{
  int val
  tree left
  tree right
}

但是可以加兩個屬性

struct tree{
  int val
  tree left
  int lefttotal
  tree right
  int righttotal
}

通過兩個值來承載左邊的總數(shù)和右邊的總數(shù),
具體操作是通過insert上每次insert進入更低層的時候锨并,根據(jù)她進入的方向露该,增加值,
這樣就不需要花時間來calculate total這兩個值第煮,但是使用的時候卻異常方便

leetcode沒把法改變固有結構有决,所以沒辦法實現(xiàn),但是這種tree實現(xiàn)起來其實也很簡單空盼。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末书幕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子揽趾,更是在濱河造成了極大的恐慌台汇,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苟呐,居然都是意外死亡痒芝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門牵素,熙熙樓的掌柜王于貴愁眉苦臉地迎上來严衬,“玉大人,你說我怎么就攤上這事笆呆∏肓眨” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵赠幕,是天一觀的道長俄精。 經(jīng)常有香客問我,道長榕堰,這世上最難降的妖魔是什么竖慧? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮逆屡,結果婚禮上圾旨,老公的妹妹穿的比我還像新娘魏蔗。我一直安慰自己,他們只是感情好沫勿,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著产雹,像睡著了一般诫惭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蔓挖,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天夕土,我揣著相機與錄音,去河邊找鬼瘟判。 笑死怨绣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拷获。 我是一名探鬼主播篮撑,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匆瓜!你這毒婦竟也來了赢笨?” 一聲冷哼從身側響起未蝌,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎茧妒,沒想到半個月后萧吠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡桐筏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年纸型,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梅忌。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡狰腌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铸鹰,到底是詐尸還是另有隱情癌别,我是刑警寧澤皂岔,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布蹋笼,位于F島的核電站,受9級特大地震影響躁垛,放射性物質發(fā)生泄漏剖毯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一教馆、第九天 我趴在偏房一處隱蔽的房頂上張望逊谋。 院中可真熱鬧,春花似錦土铺、人聲如沸胶滋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽究恤。三九已至,卻和暖如春后德,著一層夾襖步出監(jiān)牢的瞬間部宿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工瓢湃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留理张,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓绵患,卻偏偏與公主長得像雾叭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子落蝙,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容