「算法」查找二分搜索树的第K个元素

今晚去了参加雅虎2014校园招聘的笔试,倒数第二题是实现一个在二分搜索树上查找第K个元素的算法。

听下去很简单吧,不就一个中序遍历嘛。

题目给出了以下数据结构:

struct Node
{
    int value;
    Node *left,*right;
};

和需要实现的函数声明:

Node* findKthNode(Node* root,int K);

我觉得我自己有点完美主义吧。

笔试时一直在想能不能不另外弄个递归函数来进行中序遍历,

不过这样的话返回值会很麻烦。

【你可以写迭代的遍历啊

迭代又要用栈什么的,麻烦s了。

后来回来想想,确实可以在给出的函数上递归的,主要是用到静态局部变量。

Node* findKthNode(Node* root,int K)
{   
    static int t=0;
    static Node* ans=NULL;
    if (ans!=NULL) return ans;
    if (root->left)findKthNode(root->left,K);
    if (++t==K) ans=root;
if (ans!=NULL) return ans;
if (root->right)findKthNode(root->right,K); }

静态局部变量t和ans的作用域其实也就只能是findKthNode函数中。

但是么次函数执行完毕后,它仍然会在内存里。

下次调用定义它的函数,它会保留上一次的值。

同时,对它进行初始化的语句只有第一次调用该函数时有效。

当然,其实可以直接在函数外面定义全局变量来做这件事,

但人家给你个函数估计就是想你在里面实现吧。

 

其实我觉得这种完美主义会害死我。

posted @ 2013-10-13 02:16  WingFung  阅读(262)  评论(0编辑  收藏  举报