题解 | #二叉搜索树的第k个结点#

二叉搜索树的第k个结点

http://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a

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

方法一:递归法求解

求解思路
我们采用递归的方式,不断递归深入根节点的左孩子,直到碰到空节点为止,然后回溯输出当前节点。再以同样的方式递归遍历其右孩子。在此期间,每访问一个节点,我们都对k进行减一操作,直到k为0,说明该节点即为第k个节点,即找到题目所要的第k个结点

图片说明

解题代码

class Solution {
public:
    int m;
    TreeNode* hyans; // 存储结果
    void dfs (TreeNode* p)
    {
        if(!p || m < 1) return; // 不满足条件直接返回NULL
        dfs(p -> left); // 对左子树进行递归
        if(m == 1) hyans = p; // 最左边结点
        if(--m > 0) dfs(p -> right); // 同样对右子树进行递归
    }
    TreeNode* KthNode (TreeNode* p, unsigned int k)
    {
        hyans = NULL; // 初始化 ans=NULL 不满足条件返回NULL
        m = k;
        dfs(p); // 进行dfs
        return hyans; // 返回结果
    }
};

复杂度分析
时间复杂度:递归法,时间复杂度为,N为二叉树的深度
空间复杂度:没有引入新的内存地址空间,空间复杂度为

方法二:非递归法求解

求解思路
我们可以利用栈来模拟递归遍历,首先根入栈,然后令根节点的左孩子不断入栈直到为空,弹出栈顶,令其右孩子入栈,重复以上操作,直到遍历结束或者访问第k个节点为止,这样即采用了非递归的方法求出本题所要求的第k个结点。

图片说明

解题代码

class Solution {
public:
    TreeNode* KthNode(TreeNode* pRoot,unsigned int k)
    {
        if(!pRoot) return nullptr; // 直接返回空
        stack<TreeNode *> hyres; // 声明栈
        TreeNode* p = pRoot;
        while(!hyres.empty() || p )
        {   //res是空 or 遍历到空节点
            while(p) // 对左子树入栈
            {
                hyres.push(p);
                p = p->left;
            }
            TreeNode* node = hyres.top();
            hyres.pop();
            if((--k)==0) return node; // 返回第k个结点
            p = node->right;
        }
        return nullptr;
    }
};

复杂度分析
时间复杂度:两层循环,因此时间复杂度为O( )
空间复杂度:声明栈,引入新的内存地址空间,因此空间复杂度为,K为题目所要求的第K个结点。

算法 文章被收录于专栏

算法题的题解以及感受

全部评论

相关推荐

竟然收到了测评听说是双机位
投递拼多多集团-PDD等公司10个岗位
点赞 评论 收藏
分享
Twilight_m...:表格简历有点难绷。说说个人看法: 1.个人基本情况里好多无意义信息,什么婚姻状况、健康状况、兴趣爱好、户口所在地、身份证号码、邮政编码,不知道的以为你填什么申请表呢。 2.校内实践个人认为对找工作几乎没帮助,建议换成和测开有关的项目,实在没得写留着也行。 3.工作经历完全看不出来是干什么的,起码看着和计算机没啥关系,建议加强描述,写点你在工作期间的实际产出、解决了什么问题。 4.个人简述大而空,看着像AI生成,感觉问题最大。“Python,C,C++成为我打造高效稳定服务的得力工具”、“我渴望凭借自身技术知识与创新能力,推动人工智能技术的应用发展,助力社会实现智能化转型”有种小学作文的美感。而且你确定你个人简述里写的你都会嘛?你AI这块写的什么“深入研究”,发几篇顶会的硕博生都不一定敢这么写。而且你AI这块的能力和软测也完全无关啊。个人简述建议写你对哪些技术栈、哪些语言、哪些生产工具的掌握,写的有条理些,而且最好是和测开强相关的。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-25 17:51
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务