二叉搜索树的第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/难度简单)的主要内容,如果未能解决你的问题,请参考以下文章