[剑指 Offer 54. 二叉搜索树的第k大节点] | 刷题打卡

76 阅读1分钟

题目描述

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

解题思路

二叉搜索树的特点是中序遍历之后是一个排序的数组

这又是一类经典的题目:首先我们要申明一个变量记录节点在树的位置,在中序遍历的位置将这个值加1,然后与K值进行比较。

这道题目和LeetCode上的230二叉搜索树中的第K小个数相比,不同点一个是求大、 一个是求小。我刚开始也想了一会怎么处理第K大个数呢,突然想到竟然中序遍历是排序好的数组,那么按照右根左的顺序不就是逆序数组了。

AC 代码

LC230. 二叉搜索树中第K小的元素

class Solution {
    int res=0;
    int rank=0;
    public int kthSmallest(TreeNode root, int k) {
        dfs(root,k);
        return res;
    }
    private void dfs(TreeNode node,int k){
        if(node==null){
            return;
        }
        dfs(node.left,k);
        rank++;
        if(rank==k){
            res=node.val;
            return;
        }
        dfs(node.right,k);
    }
}

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

class Solution {
    int num=0;
    int rank=0; 
    public int kthLargest(TreeNode root, int k) {
        //中序进行遍历
        dfs(root,k);
        return num;  
    }

    private void dfs(TreeNode node,int k){
        if(node==null){
            return;
        }
        dfs(node.right,k);
        rank++;
        if(k==rank){
            num=node.val;
            return;
        }
        dfs(node.left,k);
    }
}

总结

二叉搜索树是一类经典题目,必须掌握框架