題目地址:Kth Smallest Element in a BST
題目簡介:
給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。
說明:你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。
示例 1:
Input: root = [3,1,4,null,2], k = 1
3
/ \
1 4
\
2
Output: 1
示例 2:
Input: root = [5,3,6,2,4,null,null,1], k = 3
5
/ \
3 6
/ \
2 4
/
1
Output: 3
進階:如果二叉搜索樹經常被修改(插入/刪除操作)並且你需要頻繁地查找第 k 小的值,你將如何優化 kthSmallest 函數?
題目解析:
1、簡單法:BFS先將所有的元素拿出來,然後進行排序,時間效率和空間複雜度不是最優。
C++版:
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
vector <TreeNode*> nodes;
vector<int> values;
nodes.push_back(root);
values.push_back(root -> val);
while(!nodes.empty())
{
int len = nodes.size();
for (int i = 0; i < len; i++)
{
TreeNode* temp = nodes.front();
nodes.erase(nodes.begin());
if (temp -> left != NULL)
{
nodes.push_back(temp -> left);
values.push_back(temp -> left -> val);
}
if (temp -> right != NULL)
{
nodes.push_back(temp -> right);
values.push_back(temp -> right -> val);
}
}
}
sort(values.begin(), values.end());
return values[k - 1];
}
};
Python版:
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
nodes, values = [], []
nodes.append(root)
while len(nodes):
_size = len(nodes)
for i in range(_size):
temp = nodes.pop(0)
values.append(temp.val)
if temp.left != None:
nodes.append(temp.left)
if temp.right != None:
nodes.append(temp.right)
values.sort()
print(values)
return values[k - 1]
2、搜索二叉樹的性質
因爲搜索二叉樹的順序已經排好,所以只要按照順序進行左序遍歷,返回結果即可。
Python:
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
values = []
def dfs(root):
if (len(values) >= k):
return
if(root.left == None and root.right == None):
values.append(root.val)
return
if (root.left != None):
dfs(root.left)
values.append(root.val)
if (root.right != None):
dfs(root.right)
dfs(root)
print(values)
return values[k - 1]