LeetCode(230):二叉搜索树中第K小的元素 Kth Smallest Element in a BST + 非递归中序遍历(Java)

234 篇文章 1 订阅
177 篇文章 0 订阅

2019.7.31 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)

这道题主要是考察中序遍历,可以用递归和循环的方式去实现(非递归的方式需要借助显式的栈进行辅助存储)。
如果搜索树需要频繁搜索第k小的值,可以提前将中序遍历的序列保存在一个数组中。


传送门:二叉搜索树中第K小的元素

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note: You may assume k is always valid, 1 ≤ k ≤ BST’s total elements.

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:
输入: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
输出: 1

示例 2:
输入: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
输出: 3

进阶:
如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化 kthSmallest 函数?


import java.util.Stack;

/**
 *
 * Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.
 * Note: You may assume k is always valid, 1 ≤ k ≤ BST's total elements.
 * 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。
 * 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。
 *
 */

public class KthSmallestElementInABST {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    //递归中序遍历
    public int num;
    public TreeNode result;
    public int kthSmallest(TreeNode root, int k) {
        num = 0;
        result = null;
        Solution(root, k);
        return result.val;
    }

    public void Solution(TreeNode root, int k){
        if(num == k || root == null)
            return;
        Solution(root.left, k);
        if(num == k)
            return;
        result = root;
        ++num;
        Solution(root.right, k);
    }

    //循环中序遍历
    public int kthSmallest1(TreeNode root, int k) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curNode = root;
        int num = 0;
        while(curNode != null || !stack.empty()){
            if(curNode != null){
                stack.push(curNode);
                curNode = curNode.left;
            }else{
                curNode = stack.pop();
                if(++num == k)
                    return curNode.val;
                curNode = curNode.right;
            }
        }
        return -1;
    }

}



#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值