【剑指Offer 54】Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务

130 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情

一、题目描述

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

二、思路分析

我们首先来看看什么是二叉搜索树呢?

首先它是一棵二叉树,同时具有特定的性质

  • 左儿子的值一定小于自己
  • 右儿子的值一定大于自己

这样的性质就决定了二叉搜索树可以用来做很多的东西,同时这也是数据结构的入门知识。

对于本题,我们直接将该树 dfs 遍历一遍,得到有序的数组后再输出即可。

遍历方式为中序遍历,如何区分几种遍历方式呢?

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中 如何记忆呢?其实就是看“中”在哪个位置,先遍历“中”就是前序,其他分别是中序和后序。

当然了,我自己写的时候写太快了没去想怎么优化,其实还有比On更快的方法:遍历到第k个时就停下来直接输出即可。

三、AC代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> ans;

    void dfs(TreeNode* root){
        if (root->left != NULL) {
            dfs(root->left);
        }
        ans.push_back(root->val);
        if (root->right !=NULL) {
            dfs(root->right);
        }
    }

    int kthLargest(TreeNode* root, int k) {
        dfs(root);
        int n = ans.size();
        return ans[n-k];
    }
};

四、总结

该知识点为数据结构的入门简单知识,在这里再熟悉一下,同时它也引申出了二叉树的遍历方法

  • 前序遍历
  • 中序遍历
  • 后序遍历