LeetCode——230. 二叉搜索树中第K小的元素(Kth Smallest Element in a BST)[中等]——分析及代码(C++)

LeetCode——230. 二叉搜索树中第K小的元素[Kth Smallest Element in a BST][中等]——分析及代码[C++]

一、题目

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。
 
示例 1:

输入:root = [3,1,4,null,2], k = 1
输出:1

示例 2:

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:3

提示:

  • 树中的节点数为 n 。
  • 1 <= k <= n <= 10^4
  • 0 <= Node.val <= 10^4

进阶:如果二叉搜索树经常被修改(插入/删除操作)并且你需要频繁地查找第 k 小的值,你将如何优化算法?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 中序遍历

(1)思路

结合二叉搜索树的特点进行中序遍历,搜索到的第 k 个节点对应的值就是待求解的第 k 个最小元素。

(2)代码

class Solution {
    
    
public:
    int kthSmallest(TreeNode* root, int k) {
    
    
        TreeNode* curr = root;//当前节点指针
        int cnt = k;//待遍历的节点数
        stack<TreeNode*> sta;//栈,用于迭代
        while (curr != nullptr || sta.size() > 0) {
    
    //中序遍历二叉搜索树
            while (curr != nullptr) {
    
    //沿左子节点搜索入栈
                sta.push(curr);
                curr = curr->left;
            }
            curr = sta.top();//取出栈顶元素
            sta.pop();
            if (--cnt == 0) {
    
    //更新计数器
                break;//当前节点为第k个,跳出循环
            }
            curr = curr->right;//遍历右子树
        }
        return curr->val;//返回第k个最小元素
    }
};

(3)结果

执行用时 :12 ms,在所有 C++ 提交中击败了 90.33% 的用户;
内存消耗 :23.6 MB,在所有 C++ 提交中击败了 40.30% 的用户。

三、其他

针对“进阶”中的问题,可进一步记录各个节点所对应子树的节点数,并通过维护二叉搜索树的平衡性来进一步降低时间复杂度。

Guess you like

Origin blog.csdn.net/zml66666/article/details/120806840