230. 二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


class Solution {

    private static Helper solve(TreeNode root, int k) {
        if (root == null) {
            return new Helper(0, null);
        }
        Helper left = solve(root.left, k);

        if (left.value != null) {
            return left;
        }

        if (left.num + 1 == k) {
            return new Helper(k, root);
        }

        Helper right = solve(root.right, k - left.num - 1);

        if (right.value != null) {
            return right;
        }

        return new Helper(left.num + 1 + right.num, null);
    }

    public static int kthSmallest(TreeNode root, int k) {
        return solve(root, k).value.val;
    }

    public static void main(String[] args) {
        TreeNode n5 = new TreeNode(5);
        TreeNode n3 = new TreeNode(3);
        TreeNode n6 = new TreeNode(6);
        n5.left = n3;
        n5.right = n6;
        TreeNode n2 = new TreeNode(2);
        TreeNode n4 = new TreeNode(4);
        n3.left = n2;
        n3.right = n4;
        n2.left = new TreeNode(1);
        System.out.println(kthSmallest(n5, 3));
    }
}

class Helper {
    int num;
    TreeNode value;

    public Helper(int num, TreeNode value) {
        this.num = num;
        this.value = value;
    }
}

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

    TreeNode() {
    }

    TreeNode(int val) {
        this.val = val;
    }

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

posted @ 2021-12-08 14:48  Tianyiya  阅读(19)  评论(0)    收藏  举报