我是靠谱客的博主 务实小鸭子,最近开发中收集的这篇文章主要介绍剑指 Offer 54.——二叉搜索树的第k大节点,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-di-kda-jie-dian-lcof/

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

这里是引用

解题过程

方法一:中序遍历,然后取值

二叉搜索数中序遍历的结果就是一个有序数组,算法也很容易写。这里使用了ArrayList

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private ArrayList<Integer> res = new ArrayList<>();
    public int kthLargest(TreeNode root, int k) {
        midSearch(root);
        return res.get(res.size() - k);
    }

	// 中序遍历
    private void midSearch(TreeNode root){
        if (root == null) {
            return;
        }

        midSearch(root.left);
        res.add(root.val);
        midSearch(root.right);
    }
}

在这里插入图片描述

方法二:在方法一的基础上优化

其实,用不着遍历所有的数,只需要找到第 k 大的数就行。

另外,中序遍历也不一定非要先遍历左子树,这题就先遍历右子树

每次遍历就统计一下已经遍历的最大数的个数,遇到等于k时,就返回值。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    private int count = 0, ans = 0;
    private ArrayList<Integer> res = new ArrayList<>();
    public int kthLargest(TreeNode root, int k) {
        midSearch(root, k);
        return ans;
    }

    private void midSearch(TreeNode root, int k){
        if (root == null) return;

        midSearch(root.right, k);
        if (++count == k){
            ans = root.val;
            return;
        }
        midSearch(root.left, k);
        
    }
}

在这里插入图片描述

最后

以上就是务实小鸭子为你收集整理的剑指 Offer 54.——二叉搜索树的第k大节点的全部内容,希望文章能够帮你解决剑指 Offer 54.——二叉搜索树的第k大节点所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部