「算法」查找二分搜索树的第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函数中。
但是么次函数执行完毕后,它仍然会在内存里。
下次调用定义它的函数,它会保留上一次的值。
同时,对它进行初始化的语句只有第一次调用该函数时有效。
当然,其实可以直接在函数外面定义全局变量来做这件事,
但人家给你个函数估计就是想你在里面实现吧。
其实我觉得这种完美主义会害死我。