大厂面试:二叉搜索树如何获取其中第k小的结点

一、思路
二叉搜索树的中序遍历结果正好是从小到大排序好的,按照中序遍历顺序找第k个节点。
例如二叉搜索树(20,10,30,2,11,24,38)中第三小结点的值为11。


二、代码

public class Solution {
    public static void main(String[] args) {
        //构建二叉搜索树
        TreeNode root = new TreeNode(20);
        root.left = new TreeNode(10);
        root.right = new TreeNode(30);
        root.left.left = new TreeNode(2);
        root.left.right = new TreeNode(11);
        root.right.left = new TreeNode(24);
        root.right.right = new TreeNode(38);
        Solution solution = new Solution();
        //获取第3小的节点
        int k=3;
        TreeNode node = solution.getKthNode(root,k);
        if (null!=node) {
            System.out.println("找到第"+k+"小的节点值为:"+node.value);
        } else {
            System.out.println("未找到第"+k+"小的节点");
        }
    }
    //节点类
    public static class TreeNode {
        int value;
        TreeNode left;
        TreeNode right;
        TreeNode(int value) {
            this.value = value;
        }
    }

    //计数器
    private int index = 0;

    /**
     * 获取二叉搜索树中第k个节点的对象
     * @param root  二叉树根节点
     * @param k     要查的节点位置k
     * @return      第k个节点对象,若存在则返回,不存在则返回null
     */
    public TreeNode getKthNode(TreeNode root, int k){
        if(root != null){
//            先查左子树的第k小的节点
            TreeNode node = getKthNode(root.left,k);
//            若左子树中查到则直接返回
            if(node != null) {
                return node;
            }
            index ++;
            //命中索引为k的节点,直接返回
            if(index == k) {
                return root;
            }
//            再查右子树的第k小的节点
            node = getKthNode(root.right,k);
//            若右子树中查到则直接返回
            if(node != null) {
                return node;
            }
        }
        return null;
    }
}


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 21:32:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 21:32:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 21:32:03       82 阅读
  4. Python语言-面向对象

    2024-04-23 21:32:03       91 阅读

热门阅读

  1. 动态规划专练( 231.打家劫舍Ⅱ)

    2024-04-23 21:32:03       32 阅读
  2. DataFrame python 根据某个字段排序

    2024-04-23 21:32:03       37 阅读
  3. 重参数化(Reparameterization)的原理

    2024-04-23 21:32:03       44 阅读
  4. C#Lazy 实现延迟加载详解与示例

    2024-04-23 21:32:03       31 阅读
  5. PHP实现阿里OSS对象存储

    2024-04-23 21:32:03       36 阅读