题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
思路
二叉搜索树的中序遍历序列是一个从小到大的有序序列,故二叉搜索树第k(大、小)个结点问题,就是中序遍历二叉搜索树,对序列结果对应输出第K个
有递归和非递归两种遍历方式,可看作遍历+按条件输出结点。
C++实现
/****递归遍历,将结果存在vector中*************/
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if(pRoot == NULL || k<=0)
return NULL;
vector<TreeNode*> res;
KthNodeCore(pRoot, res);
if(k>res.size())
return NULL;
return res[k-1];
}
void KthNodeCore(TreeNode* pRoot, vector<TreeNode*> &res)
{
if(pRoot == NULL)
return;
KthNodeCore(pRoot->left, res);
res.push_back(pRoot);
KthNodeCore(pRoot->right, res);
}
/****非递归实现,借助栈***********/
TreeNode* KthNode(TreeNode* pRoot, int k)
{
stack<TreeNode*> s;
TreeNode* node = pRoot;
int index = 0;
while(node != NULL || !s.empty())
{
while(node)
{
s.push(node);
node = node->left;
}
if(!s.empty())
{
node = s.top();
index ++;
s.pop();
if(index == k)
return node;
node = node->right;
}
}
return NULL;
}