题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
设计到二叉搜索树,就应当知道一个二叉搜索树的重要知识,那就是其中序遍历是递增序列。在得到一个递增序列之后就很容易获得第k大的值;这里我用非递归的方法对二叉树进行序列化,用到栈对结点进行缓存。细节见代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
*/
class Solution {
public:
stack<TreeNode*> s;
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot == NULL)
{
return NULL;
}
TreeNode* temp = pRoot;
TreeNode* result = NULL;
int counter = 0;
while (temp || !s.empty())
{
//先找最左孩子
while (temp)
{
s.push(temp);
temp = temp->left;
}
if (!s.empty())
{
counter += 1;
if (counter == k)
{
result = s.top();
}
temp = s.top();
s.pop();
temp = temp->right;
}
}
return result;
}
};