230_KthSmallestElementinaBST - a920604a/leetcode GitHub Wiki
title: 230. Kth Smallest Element in a BST
Follow up 中說假設該 BST 被修改的很频繁
follow up 必須先建立一個樹其值存該節點下包含(自己)節點。
用inorder 拜訪每個節點,每拜訪一個節點 k--
,直到k=0
時,便返回節點的值
class Solution {
public:
void inorder(TreeNode* root, int& k, int &ret){
if(!root) return;
inorder(root->left, k, ret);
k--;
if(k==0) {
ret = root->val;
return ;
}
inorder(root->right, k, ret);
}
int kthSmallest(TreeNode* root, int k) {
int ret = -1;
inorder(root,k, ret);
return ret;
}
};
也可以inorder traverse方式拜訪節點並存在vector ,最後在
return vector[k];
即可
class Solution {
public:
int ret;
void dfs(TreeNode *root, int *k){
if(!root) return;
dfs(root->left, k);
(*k)--;
if(*k==0){
ret=root->val;
}
dfs(root->right,k);
}
int kthSmallest(TreeNode* root, int k) {
dfs(root,&k);
return ret;
}
};
需要一個stack ,將當下拜訪到的節點的左子樹都每一個節點push 進去stack 如果拜訪到的是空節點,那則會從stack 頂部取得拜訪節點。
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode *> sta;
TreeNode * p = root;
while(p || !sta.empty()){
while(p){
sta.push(p);
p=p->left;
}
p = sta.top();
sta.pop();
k--;
if(k==0) return p->val;
p=p->right;
}
return -1;
}
};
- 由於BST 特性,可以快速定位第k小的是在左右子樹。
- 先計算左子樹有多少節點,在判斷要往左子樹還是右子樹去尋找還是當前節點。
class Solution {
public:
int count(TreeNode* node) {
if(!node) return 0;
return 1+count(node->left)+count(node->right);
}
int kthSmallest(TreeNode* root, int k) {
int lcount = count(root->left);
if(k<=lcount) return kthSmallest(root->left, k);
else if(k==lcount+1) return root->val;
return kthSmallest(root->right, k-lcount-1);
}
};
- option 1
- time complexity
O(n)
- space complexity
O(h)
- time complexity
- option 2
- time complexity
O(n)
- space complexity
O(h)
- time complexity
- option 3
- time complexity
O(n)
for best case,O(n^2)
for worst case - space complexity
O(h)
- time complexity