算法 - 二叉搜索树的第k个结点

题目

给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。

解题思路

使用栈存储数据,循环比较数据和栈里面数据大小,大于就出栈,一直找到当前数据应该呆的位置,然后再将出栈的数据放回来。

编码


    private static TreeNode KthNode(TreeNode pRoot, int k) {
        if (k == 0) {
            return null;
        }

        Stack<TreeNode> stack = new Stack<>();
        recursive(pRoot, k, stack);
        if (stack.size() < k) {
            return null;
        }
        return stack.get(k - 1);
    }

    private static void recursive(TreeNode node, int k, Stack<TreeNode> stack) {
        if (node == null) {
            return;
        }

        // 存储临时出栈的节点
        Stack<TreeNode> tempStack = new Stack<>();
        // 找位置:依次比较当前节点值和栈里已经有的值 小于就出栈
        for (int i = stack.size(); i > 0 && node.val < stack.peek().val; i--) {
            tempStack.push(stack.pop());
        }

        // 入栈
        stack.push(node);

        // 将出栈的数据再放回来
        for (int i = tempStack.size(); i > 0 && stack.size() < k; i--) {
            stack.push(tempStack.pop());
        }

        // 递归
        recursive(node.left, k, stack);
        recursive(node.right, k, stack);
    }

posted @ 2020-06-11 13:53  慢慢行  阅读(16)  评论(0编辑  收藏  举报