美文网首页
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