LeetCode刷题笔记(Kth Smallest Element in a BST)

紧接着笔者又刷了一道题,这道题的思路很清晰,下面就和大家分享一下经验吧!

题目如下:

Given a binary search tree, write a function kthSmallest to find the kth smallest element in it.

Note: 
You may assume k is always valid, 1 ≤ k ≤ BST's total elements.

Example 1:

Input: root = [3,1,4,null,2], k = 1
   3
  / \
 1   4
  \
   2
Output: 1
Example 2:

Input: root = [5,3,6,2,4,null,null,1], k = 3
       5
      / \
     3   6
    / \
   2   4
  /
 1
Output: 3
Follow up:
What if the BST is modified (insert/delete operations) often and you need to find the kth smallest frequently? How would you optimize the kthSmallest routine?

题意分析:

给定一个二分搜索树,请找到该树中第k小的节点值。

方法一(中序遍历_递归法)

先对给定的二分搜索树进行中序遍历,然后将得到的升序数组中第k个元素返回即可。

解题代码如下:

class Solution{
public:
    int kthSmallest(TreeNode* root, int k){
        if(root==NULL)
            return 0;
        vector<int> v;
        Inorder(root,v);
        return v[k-1];

    }
    void Inorder(TreeNode* root, vector<int>& v){
        if(root!=NULL) 
        {
            Inorder(root->left, v);
            v.push_back(root->val);
            Inorder(root->right, v);
        }

    }

};

提交后的结果如下:

方法二(中序遍历_非递归法)

该方法中用的是三种遍历方式通用的非递归法,所以需要新建一个结构体Instruction。

解题代码如下:

struct Instruction{
    string s;
    TreeNode* node;
    Instruction(string s, TreeNode* node): s(s), node(node){}
};



class Solution{
public:
    int kthSmallest(TreeNode* root, int k){
        if(root==NULL) return 0;
        vector<int> v;
        stack<Instruction> s;
        s.push(Instruction("Go", root));
        while(!s.empty()){
            Instruction instruction = s.top();
            s.pop();
            if (instruction.s == "Out") v.push_back(instruction.node->val);
            else{
                if(instruction.node->right) s.push(Instruction("Go", instruction.node->right));
                s.push(Instruction("Out", instruction.node));
                if(instruction.node->left) s.push(Instruction("Go", instruction.node->left));
            }
        }
        return v[k-1];
    }
};

提交后的结果如下:

 

 

 

日积月累,与君共进,增增小结,未完待续。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值