LeetCode75|二叉搜索树的第k大节点

时间:2022-07-26
本文章向大家介绍LeetCode75|二叉搜索树的第k大节点,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1,问题简述

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

2,示例

示例 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 ≤ 二叉搜索树元素个数

3,题解思路

迭代,时间复杂度高,目前先实现,后续在用深度优先遍历的方式解决

4,题解程序


import java.util.*;

public class KthLargestTest2 {
    public static void main(String[] args) {
        TreeNode t1 = new TreeNode(5);
        TreeNode t2 = new TreeNode(3);
        TreeNode t3 = new TreeNode(6);
        TreeNode t4 = new TreeNode(2);
        TreeNode t5 = new TreeNode(4);
        TreeNode t6 = new TreeNode(1);
        t1.left = t2;
        t1.right = t3;
        t2.left = t4;
        t2.right = t5;
        t4.left = t6;
        int k = 3;
        int kthLargest = kthLargest(t1, k);
        System.out.println("kthLargest = " + kthLargest);
        KthLargestTest2 test2 = new KthLargestTest2();
        int kthLargest2 = test2.kthLargest2(t1, k);
        System.out.println("kthLargest2 = " + kthLargest2);
    }


    public static int kthLargest(TreeNode root, int k) {
        if (root == null) {
            return -1;
        }
        if (root.left == null && root.right == null) {
            return root.val;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        List<Integer> list = new ArrayList<>();
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                list.add(node.val);
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
        Collections.sort(list, Comparator.reverseOrder());
        return list.get(k - 1);
    }

    int res;
    int k;

    public int kthLargest2(TreeNode root, int k) {
        this.k = k;
        dfs(root);
        return res;
    }

    private void dfs(TreeNode root) {
        if (root == null) {
            return;
        }
        dfs(root.right);
        if (k == 0) {
            return;
        }
        if (--k == 0) {
            res = root.val;
        }
        dfs(root.left);
    }
}

5,题解程序图片版

6,总结

现在输出的内容都是之前写的,但是没有整理成一篇篇文章,这里就想着慢慢把之前的题都整理成一套,目前在输出几十篇,我也不知道什么时候能输出完成,慢慢输出吧,帮助自己的同时,能帮助到需要的人是再好不过了。