剑指 Offer 54. 二叉搜索树的第k大节点

98 阅读1分钟

题目描述

image.png

思路

  • 由于是求第K大,所以用右—中—左的方式进行中序遍历,当计数=k时,返回即可。

版本1:迭代

//非递归,右中左
class Solution {
    public int kthLargest(TreeNode root, int k) {
        int count = 0;
        Stack<TreeNode> stack = new Stack<>();
        TreeNode node = root;
        while (!stack.isEmpty() || node != null) {//别写成 node == root
            if (node != null) {
                stack.push(node);
                node = node.right;
            } else {
                TreeNode father = stack.pop();
                count++;//计数
                if (count == k) {
                    return father.val;
                }
                node = father.left;
            }
        }
        return 0;
    }
}

版本2:递归

class Solution {
    int res = 0;
    int count = 0;//注意要把count设置成全局变量,因为中序遍历中list是个全局变量。
    public int kthLargest(TreeNode root, int k) {
        dfs(root, k);
        return res;
    }
    public void dfs(TreeNode node, int k) {
        if (node == null) {
            return;
        }
        dfs(node.right,k);
        count++; //访问node,所以计数+1
        if (count == k) {//由于为搜索书,count就是第cout大
            res = node.val;
            return;
        }
        dfs(node.left, k);

    }
}