Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2794870
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-05-01 16:02:07

BSTree中查找第k小的数

二叉搜索树中超找第k小元素,要求时间复杂度为O(logn).

分析:要查找第k小的元素,首先得应该知道以当前节点为根的左子树有多少个节点,加入为m个,

如果k = m + 1,很好pcur就是要第k小元素了

如果k < m + 1,那么我们只需要递归在左子树中查找

如果k > m + 1,那么我们就在右子树中查找第k - m - 1小的元素了。

分析到此,可以知道每当遍历到一个节点,必须知道子树个数信息,不然不知道往哪个分支走,第一反应是在

节点中增加一个field,即表示节点个数信息,那加入题目不让你添加额外的空间怎么办?

继续分析,要想找到第k小的元素,我们就利用中序遍历(从小到大),先从最小元素往后遍历不就行了,记录走了多少步了

如果到k步了,停止return就ok了,至此代码很容易就写出来了:

/*
*@brief 寻找第k小元素
*@param pcur the root of the subtree
*@param k the index of the elements searched for
*@return the node of the kth elements
*@time O(logn)
*/
BTreeNode* BSTree::get_kth_value(BTreeNode* pcur, int &k)
{
if(NULL == pcur)
return NULL;
BTreeNode *rst = NULL;
rst = get_kth_value(pcur->left, k);
--k;
if(0 == k)
rst = pcur;
if(0 < k)
rst = get_kth_value(pcur->right, k);
return rst;
} 转自http://www.cnblogs.com/buptLizer/archive/2012/04/01/2428200.html

阅读(1978) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~