题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。
例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
递归版
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
int cnt = 0;
TreeNode* KthNode(TreeNode* root,int k)
{
if(root)
{
TreeNode* node = KthNode(root->left,k);
if(node)return node; //
cnt++;
if(cnt==k)return root;
node = KthNode(root->right,k);
if(node)return node;
}
return nullptr;
}
};
非递归版
class Solution {
public:
TreeNode* KthNode(TreeNode* root,int k)
{
stack<TreeNode*> S;
int cnt =0;
TreeNode* node =root;
while(node!=nullptr||!S.empty())
{
while(node!=nullptr)
{
S.push(node);
node= node->left;
}
if(!S.empty())
{
node = S.top();
S.pop();
cnt++;
if(cnt==k)return node;
node = node->right;
}
}
return nullptr;
}
};
本文介绍了一种算法,用于在给定的二叉搜索树中找到第K大的结点。提供了递归和非递归两种实现方式,递归版本通过中序遍历递归地访问左子树、根节点和右子树;非递归版本使用栈来迭代遍历,实现了相同的逻辑。
1102

被折叠的 条评论
为什么被折叠?



