解题思路一:O(n)
利用二叉搜索树BST的特性,左子树值都小于根节点,右子树值大于根节点,所以使用中序遍历,当遍历到第k个节点就是第k个最小的节点。以下代码依然遍历了整个BST,有兴趣的同学可以修改一下,遍历到第k个节点就结束,可以提高算法效率。
class Solution {
public:
int result;
int t = 0;
void inTraverse(TreeNode* node, int k){ //中序遍历
if(node != NULL){
inTraverse(node->left, k);
if(++t == k){
result = node->val;
return;
}
inTraverse(node->right, k);
}
return;
}
int kthSmallest(TreeNode* root, int k) {
inTraverse(root, k);
return result;
}
};
解题思路二:O(nlog(n))
较为朴素的想法。先序遍历BST,将其值存在List中,再调用排序算法,返回第k个元素,主要时间都用在排序上了。
class Solution {
List<Integer> value = new ArrayList<>();
void preTraverse(TreeNode node){ //先序遍历
if(node != null){
value.add(node.val);
preTraverse(node.left);
preTraverse(node.right);
}
return;
}
public int kthSmallest(TreeNode root, int k) {
preTraverse(root);
Collections.sort(value);
return value.get(k - 1);
}
}