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];
}
};
四、总结
该知识点为数据结构的入门简单知识,在这里再熟悉一下,同时它也引申出了二叉树的遍历方法
- 前序遍历
- 中序遍历
- 后序遍历