【剑指offer】——常规练习题1

一、二叉搜索树的第K大结点

1、题目要求
给定一颗二叉搜索树,请找出其中第k大的节点。例如:在下面这颗二叉搜索树中,按结点数值大小排序,第三大结点的值是4.
在这里插入图片描述
2、题目分析
根据二叉搜索树的特点,我们都知道中序遍历的结果就是递增的排序。所以我们只需要中序遍历算法遍历一颗二叉搜索树,就可以找到他的第k大结点。具体代码实现如下:

BiaryTreeNode* KthNodeCore(BiaryTreeNode* pRoot, unsigned int k)
{
   
	BiaryTreeNode* target = nullptr;

	if (pRoot->leftchild != nullptr)
		target = KthNodeCore(pRoot->leftchild, k);
	if (target == nullptr)
	{
   
		if (k == 1)
			target = pRoot;
		k--;
	}
	if (target == nullptr && target->leftchild != nullptr)
		target = KthNodeCore(pRoot->rightchild, k);
	return target;
}
BiaryTreeNode* KthNode(BiaryTreeNode* pRoot, unsigned int k)
{
   
	if (pRoot == nullptr || k == 0)
		return nullptr;
	return KthNodeCore(pRoot, k);
}

二、和为s的数字

2.1和为s的两个数字

1、题目要求
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得他们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
2、题目解析
方法一:
看到这题能想到的最直接的解法就是先在数组中固定一个数字,再依次判断数组中其余的n-1个数字与它的和是不是等于s。但是这种算法的时间复杂度是O(n^2)。不值得提倡使用
方法二:
既然上面这种方法不可行,那么就要找到一种更优的算法来解决。我们要抓住数组有的特点。我们还是以具体的例子来加以分析,以数组{1,2,4,7,11,15}及期待的和15为例子。我们定义两个指针,第一个指针p1指向数组的第一个数字,第二个指针p2指向数组的最后一个数。然后计算两个数的和sum。数组指针指向如下图所示:
在这里插入图片描述
然后做出相关调整,调整的规则是:如果两个数的和sum大于s,则p2往前移动寻找较大数字前面的数字;如果两个数的和sum小于s,则p1往后移动寻找较小数字后面的数字。这个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值