力扣算法 - 二叉搜索树的第k大节点

211 阅读1分钟

二叉搜索树的第k大节点

给定一棵二叉搜索树,请找出其中第k大的节点。

示例 1:

输入: root = [3,1,4,null,2], k = 1

   3
  / \
 1   4
  \
   2

输出: 4

示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3

       5
      / \
     3   6
    / \
   2   4
  /
 1

输出: 4  

限制:

1 ≤ k ≤ 二叉搜索树元素个数

思路

利用递归思想, 二叉搜索树利用中序遍历会得到一个递增数列 调整下递归方法中的顺序 "右子树" "根节点" "左子树" 就会得到一个递减数列

Java解题
    ArrayList<TreeNode> arrayList = new ArrayList<>();

    public int kthLargest(TreeNode root, int k) {
        if (k == 0 || root == null) return -1;
        inorder(root);
        TreeNode node = arrayList.get(k - 1);
        return node.val;
    }
    public void inorder(TreeNode root) {
        if (root == null) return;
        inorder(root.right);
        arrayList.add(root);
        inorder(root.left);
    }

Swift解题
    func kthLargest(_ root: TreeNode?, _ k: Int) -> Int {
        if k == 0 || root == nil {
            return -1;
        }
        inorder(root)
        let node = arrayList[k - 1];
        return node.val
    }
    
    func inorder(_ root: TreeNode?) {
        if root == nil {
            return
        }
        inorder(root?.right)
        arrayList.append((root?.right)!)
        inorder(root?.left)
    }
    
    ```