思想:
以下是求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.從第乙個開始找,如果第乙個元素等於要尋找的字串的第乙個元素,就繼續去尋找該元素的上下左右,看是否等於其下乙個。一直匹配到最後乙個元素...