一、二叉搜索树的第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往后移动寻找较小数字后面的数字。这个