题目如下:输入二叉搜索树和K,输出第K大的节点指针
/*
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, unsigned int k)
{
}
};
二叉搜索树定义:
二叉搜索树是:或者为空树,或者是这样一棵二叉树:1.若左子树不为空,左子树所有节点都小于根节点;2.若右子树不为空,右子树所有节点都大于根节点;3.左右子树都是二叉搜索树。
要求二叉搜索树的第k个结点,最直接的想法是:求出排序序列,输出该序列的第k个元素。
对二叉搜索树的排序很简单:就是一个对树的中序的DFS。
DFS可以用递归写,或者用stack。(BFS用queue)
其实递归本质上也是stack的应用。
其实并不用把所有的元素都排序,只排到第k个就可以了。
这就要DFS搜索时,用变量记录排到第几个了。
代码如下:
方法1:递归
方法2.用stack:
TreeNode* KthNode(TreeNode* pRoot, unsigned int k)
{
unsigned int i=0;
stack<TreeNode*> s;
TreeNode * temp=pRoot;
while(temp!=NULL || !s.empty())
{
while(temp!=NULL)
{
s.push(temp);
temp=temp->left;
}
if(!s.empty())
{
temp=s.top();
s.pop();
if(++i==k) return temp;
temp=temp->right;
}
}
return NULL;
}
两种方法大同小异。
递归理解起来稍微难一点,代码不复杂,多想想。
我在用方法2stack实现的时候,犯了一个低级错误:
while判断条件中的 temp!=NULL ,写成了 !temp (也许是受到 !s.empty() 写法的影响)。
注意 !temp 等价于 temp==NULL ,temp是空指针。
!s.empty() 等价于 s.empty()==0 , s不是空栈。
这种错误,也是无语,以后指针还是写全==或!=NULL,尽量避免这种错误。