《LeetCode之每日一题》:180.二叉搜索树中第K小的元素
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:180.二叉搜索树中第K小的元素相关的知识,希望对你有一定的参考价值。
题目链接: 二叉搜索树中第K小的元素
有关题目
给定一个二叉搜索树的根节点 root ,和一个整数 k ,
请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
提示:
树中的节点数为 n 。
1 <= k <= n <= 10^4
0 <= Node.val <= 10^4
进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?
题解
法一:中序遍历
参考官方题解
Tips
二叉搜索树具有如下性质:
结点的左子树只包含小于当前结点的数。
结点的右子树只包含大于当前结点的数。
所有左子树和右子树自身必须也是二叉搜索树。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> stack;
//中序遍历按照左子树-》根节点-》右子树
//而访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树
while(root != nullptr || stack.size() > 0)
{
while(root != nullptr)
{
stack.push(root);
root = root->left;
}
root = stack.top();
stack.pop();
--k;
if (k == 0)//说明找到第k小的节点,跳出循环
break;
//切换当前子树为右节点
root = root->right;
}
return root->val;
}
};
以上是关于《LeetCode之每日一题》:180.二叉搜索树中第K小的元素的主要内容,如果未能解决你的问题,请参考以下文章
leetcode每日一题(2020-07-21):95. 不同的二叉搜索树 II