美文网首页
Leetcode230二叉搜索树中第K小的元素

Leetcode230二叉搜索树中第K小的元素

作者: answerLDA | 来源:发表于2019-10-27 13:49 被阅读0次

题目

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:
输入: root = [3,1,4,null,2], k = 1
3
/
1 4

2
输出: 1

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

分析

利用二叉搜索树的性质,在中序遍历的过程中,如果刚好遍历到第K大个节点时,则返回此节点;如果没到第K大个节点,则返回NULL,让其回去上一层。

代码(含详细的注释)

/**
 * 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:
    int kthSmallest(TreeNode* root, int k) {
        int *m;
        m = &k;
        return middleGet(root,m)->val;
    }
    /**
    * 中序遍历获取第k节点
    **/
    TreeNode* middleGet(TreeNode* root,int *m){
        //先变量左节点
        if(root->left){
            TreeNode* p =  middleGet(root->left,m);
            //如果返回第k个节点,就返回
            if(p){
                return p;
            }
        }
        //遍历中间节点
        --*m;
        //如果是中间节点为第k个节点,就返回
        if(!*m){
            return root;
        }
        //后续遍历右节点
        if(root->right){
            TreeNode* p =  middleGet(root->right,m);
            //如果返回第k个节点,就返回
            if(p){
                return p;
            }
        }
        //否则返回空节点,证明在此分支没找到
        return NULL;
    }
};

相关文章

网友评论

      本文标题:Leetcode230二叉搜索树中第K小的元素

      本文链接:https://www.haomeiwen.com/subject/sxgpvctx.html