二叉搜索树的第k个结点(NC81/考察次数Top67/难度简单)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树的第k个结点(NC81/考察次数Top67/难度简单)相关的知识,希望对你有一定的参考价值。

描述:
给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。

示例1
输入:
5,3,7,2,4,6,8,3
返回值:
4

说明:
按结点数值大小顺序第三小结点的值为4
(题目来自牛客网)

用C++实现如下

/*
struct TreeNode 
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) 
    
;
*/
class Solution 
public:
    TreeNode* KthNode(TreeNode* pRoot, int k)
          //此函数用于返回第k个节点
           //给定一棵二叉搜索树,请找出其中的第k个结点。
 
//         //思路1,死磕递归法(此题目思路采用的是中序遍历二叉树);思路2,使用栈来模拟递归流程
//         if(pRoot==nullptr)
//             return nullptr;
//         int node_count = nodeCount(pRoot->left);       //计算左子树及底层有多少个节点
//         if(k <= node_count)                            //此条件,第k个节点在左子树中
//             return KthNode(pRoot->left, k);            //递归函数左子树节点求解
//         if(k == node_count + 1)                        //此条件,第k个节点就是满足条件的
//             return pRoot;
//         return KthNode(pRoot->right, k-node_count-1);  //递归函数右子树节点求解
//     
 
//     int nodeCount(TreeNode* root)                     //此节点用于获取此节点
//         if(root == nullptr)                            //以及底层节点的总数
//             return 0;
//         return nodeCount(root->left)+nodeCount(root->right)+1;

        if(pRoot==nullptr || k<=0)
            return nullptr;
        stack<TreeNode*> res;                //定义一个stack用于存储前序遍历的结果
        TreeNode* cur = pRoot;               //定义当前节点为根部节点
        while(!res.empty() || cur)          //有一个不为空则需要一直遍历下去
            while(cur)
                res.push(cur);               //当前节点不为空,则push到stack中
                cur = cur->left;             //当前节点不为空,cur变为cur的左子树
            
            TreeNode* node = res.top();      //定义一个node等于stack的top
            res.pop();                       //奖stack的top弹出来
            if((--k)==0)                     //弹出了k个,就是第k个
                return node;
            cur = node->right;               //top的右子树,特别适应于前序遍历
        
        return nullptr;
    
;

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于二叉搜索树的第k个结点(NC81/考察次数Top67/难度简单)的主要内容,如果未能解决你的问题,请参考以下文章

二叉搜索树的第k个结点(NC81/考察次数Top67/难度简单)

求二叉树的层序遍历(NC15/考察次数Top6/难度中等)

二叉树的最大深度(NC13/考察次数Top42/难度简单)

最强解析面试题:二叉搜索树的第k个结点

最强解析面试题:二叉搜索树的第k个结点

剑指offer 62.二叉搜索树的第k个结点