劍指offer T54 BST的第K大 小 的結點

2021-10-07 16:07:15 字數 1013 閱讀 6415

思想:

以下是求bst的第k小結點:

根據bst的特性,所以可以這麼幹:先求左子樹中結點的個數即為leftcount,然後討論leftcount與k的大小關係,然後再到對應的子樹中去找符合條件的結點

記root的左子樹中結點的個數為leftcount

if(leftcount< k-1) :去root的右子樹中去找第k-leftcount大的結點

if(leftcount == k-1 ) 則root即為我們要找的結點

if(leftcount> k-1) :去root的左子樹中去找第k大結點

那麼求第k大就應該反過來,要基於root的右子樹中結點個數來反推:

記右子樹中結點的個數為rightcount,則我們可以得知root為第rightcount+1大的結點(以根節點為第幾大來推)

if(rightcount+1==k) return root.val

if(rightcount+1k):則去root的右子樹中找第k大的結點

【優化】:因為上面兩者方法存在重複計算的問題(求k小時重複計算左子樹中結點的個數,求k大時重複計算右子樹中結點的個數)

所以,我們還可以利用bst的中序遍歷序列是乙個遞增序列來求解

求第k小,直接使用中序遍歷,當遍歷到第k個結點時,該結點自然就是我們要找的第k小結點

求第k大,要翻轉以下,要先去遍歷右子樹,再根,再左子樹,此時還是一樣,若遍歷到第k個結點,則第k個結點即為我們所求的結點

時間複雜度o(n) , 空間複雜度o(n)

class solution 

if(++counts==k)

int rightres = kthlargest(root.left,k);

if(rightres!=integer.min_value)

return integer.min_value;

}} }

}

劍指offer T26樹的子結構

思想 雙重遞迴 第一重遞迴用於在a樹中找到於b樹的根結點相同的結點c,當找到後再去遞迴判斷以c為結點的子樹中是否包含了樹b,都找不到時直接return false definition for a binary tree node.public class treenode class soluti...

劍指offer T60 n個骰子的點數

case1 暴力列舉,直接超時,時間複雜度o 6 n 空間複雜度o n dfs不減枝的話會窮舉所有可能,這裡每一次有6種可能,共做n次,所有時間複雜度為o 6 n class solution for int digtial 1 digtial 6 digtial public double two...

劍指offer系列54 矩陣中的路徑

這個題目用的是回溯法。之前回溯法練得比較少,所以這個題還是需要重視。回溯法是演算法裡學過的,就是從第乙個可能得路徑開始找,一直找到最後乙個。這個題目要注意一下幾點 1.從第乙個開始找,如果第乙個元素等於要尋找的字串的第乙個元素,就繼續去尋找該元素的上下左右,看是否等於其下乙個。一直匹配到最後乙個元素...