剑指offer——二叉搜索树的第k个结点

题目如下:输入二叉搜索树和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:递归

class Solution {
    int count = 0;
public:
    TreeNode* KthNode(TreeNode* pRoot, unsigned int k)
    {
        if(pRoot){ 
                TreeNode *ret = KthNode(pRoot->left, k);
                if(ret) return ret;
                if(++count == k) return pRoot;
                ret = KthNode(pRoot->right,k);
                if(ret) return ret;
        }
        return nullptr;
    }
};


方法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,尽量避免这种错误。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值