二叉搜尋樹中第K小的元素

2021-09-10 01:29:22 字數 1202 閱讀 3258

目錄

1 題目描述

2 題目分析

3 **實現

3.1 中序遍歷方法

3.2 結點計數方法

給定乙個二叉搜尋樹,編寫乙個函式kthsmallest來查詢其中第k個最小的元素。

說明:

你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜尋樹元素個數。

示例 1:

輸入: root = [3,1,4,null,2], k = 1

3/ \

1 4

\  2

輸出: 1

示例 2:

輸入: root = [5,3,6,2,4,null,null,1], k = 3

5/ \

3 6

/ \2 4

/ 1輸出: 3

一看到求第k小的問題,應該會容易想到建立大頂堆來做,但是如果這道題採用大頂堆的方式來做的話,是比較麻煩的,還得轉換為陣列,這樣的話就完全忽視了二叉搜尋樹本身的特點。

為了利用二叉搜尋樹的特點,一種可以採取的方法就是對二叉搜尋樹進行中序遍歷,遍歷結果必定是個公升序陣列,當陣列長度達到k時,那麼陣列末尾的元素就是二叉搜尋樹的第k小元素了。不過這樣的話就需要乙個大小為o(k)的開闢輔助空間。

為了既利用二叉搜尋樹的特點,又能減少輔助空間的開銷,可以直接對左子樹結點進行計數,如果左子樹的結點數等於k-1的話,說明當前結點就是第k小的結點了;如果左子樹結點數小於k-1的話,說明第k小的結點在當前結點的右邊,假設左子樹上的結點有num個,那麼此時就遞迴查詢右子樹上第k-1-num小的元素;如果左子樹結點大於k-1的話,說明第k小的結點就在左子樹上,那麼就遞迴查詢左子樹上第k小的元素。

int kthsmallest(treenode* root, int k) 

void midorder(treenode* root,vector& nums,int k,int& count)

int kthsmallest(treenode* root, int k) 

int count(treenode* root)

二叉搜尋樹第K小元素

1.思路 迭代法 計算出二叉樹左節點的個數,如果左節點的個數等於k 1 則根節點就是我們要找的值,如果左節點的個數大於k 1,表明我們要查詢的第k個最小元素在左子樹中,如果左節點的個數小於k 1,表明要查詢的第k個最小元素在右子節點中,找到右子樹中第k count left 1個元素就是我們要找的元...

二叉搜尋樹中第K小的元素

給定乙個二叉搜尋樹,編寫乙個函式 kthsmallest 來查詢其中第 k 個最小的元素。說明 你可以假設 k 總是有效的,1 k 二叉搜尋樹元素個數。對二叉搜尋樹進行中序遍歷,將遍歷後的結果存到陣列中,陣列中的第k個元素就是二叉搜尋樹的第k小元素,因為二叉搜尋樹中序遍歷後得到的結果就是得到的結果就...

二叉搜尋樹中第K小的元素

描述 給定乙個二叉搜尋樹,編寫乙個函式 kthsmallest 來查詢其中第 k 個最小的元素。說明 你可以假設 k 總是有效的,1 k 二叉搜尋樹元素個數。示例 1 輸入 root 3,1,4,null,2 k 1 3 1 4 2 輸出 1示例 2 輸入 root 5,3,6,2,4,null,n...