【探索-中级算法】二叉搜索树中第K小的元素

在这里插入图片描述

根据二叉搜索树的性质,对其进行中序遍历,会得到一个递增排序的序列,这是一个特性,因此解题的时候可以利用之。

解法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 个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值