根据二叉搜索树的性质,对其进行中序遍历,会得到一个递增排序的序列,这是一个特性,因此解题的时候可以利用之。
解法1
public int kthSmallest(TreeNode root, int k) {
List<Integer> list = new ArrayList<>();
dfs(root, list, k);
return list.get(k - 1);
}
public void dfs(TreeNode node,List<Integer> list,int k) {
if (node==null) return;
dfs(node.left, list, k);
list.add(node.val);
if (k==list.size()) return;
dfs(node.right,list,k);
}
利用一个辅助链表,存储前 k 个元素,如果够了 k 个,则不再需要递归遍历,且可以直接利用辅助链表返回第 k 个元素。
解法2
参考自原题最快的解法之一。
int count = 0;//要用一个全局的值去记录,不然局部变量的话会影响到记录的结果
int val = 0;
public int kthSmallest2(TreeNode root, int k) {
if(root == null) return -1;
count = k;
dfs(root);
return val;
}
private void dfs(TreeNode root){
if(root == null||count == 0) return;
dfs(root.left);
count--;
if(count == 0) {
val = root.val;
return;
}
val = root.val;
dfs(root.right);
}
借助两个变量,来保存遍临时的状态,前面说过二叉搜索树中序遍历的特性,因此在中序递归遍历的过程中,第一个被遍历到的肯定是第一小的值。
因此用一个计数器,初始值为 count = k
,当 count = k - 1
时,表示遍历了第一个元素 … 当计数器值为 0 时,则表示已经遍历了第 k 个元素。