// 面试题54:二叉搜索树的第k个结点
// 题目:给定一棵二叉搜索树,请找出其中的第k大的结点。 #include <iostream>
#include "BinaryTree.h" const BinaryTreeNode* KthNodeCore(const BinaryTreeNode* pRoot, unsigned int& k); const BinaryTreeNode* KthNode(const BinaryTreeNode* pRoot, unsigned int k)
{
if (pRoot == nullptr || k == )//判断边界
return nullptr; return KthNodeCore(pRoot, k);
} const BinaryTreeNode* KthNodeCore(const BinaryTreeNode* pRoot, unsigned int& k)//k必须引用传递啊,不然记不住
{
const BinaryTreeNode* target = nullptr; if (pRoot->m_pLeft != nullptr)//迭代找出最小点
target = KthNodeCore(pRoot->m_pLeft, k); if (target == nullptr)//找到最小节点了,并k--,如果k==1,就算是找到了,记下target
{
if (k == )
target = pRoot; k--;
} if (target == nullptr && pRoot->m_pRight != nullptr)//一旦找到target,就不会继续迭代了,全部返回
target = KthNodeCore(pRoot->m_pRight, k); return target;
} // ====================测试代码====================
void Test(const char* testName, const BinaryTreeNode* pRoot, unsigned int k, bool isNull, int expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); const BinaryTreeNode* pTarget = KthNode(pRoot, k);
if ((isNull && pTarget == nullptr) || (!isNull && pTarget->m_nValue == expected))
printf("Passed.\n");
else
printf("FAILED.\n");
} // 8
// 6 10
// 5 7 9 11
void TestA()
{
BinaryTreeNode* pNode8 = CreateBinaryTreeNode();
BinaryTreeNode* pNode6 = CreateBinaryTreeNode();
BinaryTreeNode* pNode10 = CreateBinaryTreeNode();
BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
BinaryTreeNode* pNode7 = CreateBinaryTreeNode();
BinaryTreeNode* pNode9 = CreateBinaryTreeNode();
BinaryTreeNode* pNode11 = CreateBinaryTreeNode(); ConnectTreeNodes(pNode8, pNode6, pNode10);
ConnectTreeNodes(pNode6, pNode5, pNode7);
ConnectTreeNodes(pNode10, pNode9, pNode11); Test("TestA0", pNode8, , true, -);
Test("TestA1", pNode8, , false, );
Test("TestA2", pNode8, , false, );
Test("TestA3", pNode8, , false, );
Test("TestA4", pNode8, , false, );
Test("TestA5", pNode8, , false, );
Test("TestA6", pNode8, , false, );
Test("TestA7", pNode8, , false, );
Test("TestA8", pNode8, , true, -); DestroyTree(pNode8); printf("\n\n");
} // 5
// /
// 4
// /
// 3
// /
// 2
// /
//
void TestB()
{
BinaryTreeNode* pNode5 = CreateBinaryTreeNode();
BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
BinaryTreeNode* pNode3 = CreateBinaryTreeNode();
BinaryTreeNode* pNode2 = CreateBinaryTreeNode();
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(); ConnectTreeNodes(pNode5, pNode4, nullptr);
ConnectTreeNodes(pNode4, pNode3, nullptr);
ConnectTreeNodes(pNode3, pNode2, nullptr);
ConnectTreeNodes(pNode2, pNode1, nullptr); Test("TestB0", pNode5, , true, -);
Test("TestB1", pNode5, , false, );
Test("TestB2", pNode5, , false, );
Test("TestB3", pNode5, , false, );
Test("TestB4", pNode5, , false, );
Test("TestB5", pNode5, , false, );
Test("TestB6", pNode5, , true, -); DestroyTree(pNode5); printf("\n\n");
} // 1
// \
// 2
// \
// 3
// \
// 4
// \
//
void TestC()
{
BinaryTreeNode* pNode1 = CreateBinaryTreeNode();
BinaryTreeNode* pNode2 = CreateBinaryTreeNode();
BinaryTreeNode* pNode3 = CreateBinaryTreeNode();
BinaryTreeNode* pNode4 = CreateBinaryTreeNode();
BinaryTreeNode* pNode5 = CreateBinaryTreeNode(); ConnectTreeNodes(pNode1, nullptr, pNode2);
ConnectTreeNodes(pNode2, nullptr, pNode3);
ConnectTreeNodes(pNode3, nullptr, pNode4);
ConnectTreeNodes(pNode4, nullptr, pNode5); Test("TestC0", pNode1, , true, -);
Test("TestC1", pNode1, , false, );
Test("TestC2", pNode1, , false, );
Test("TestC3", pNode1, , false, );
Test("TestC4", pNode1, , false, );
Test("TestC5", pNode1, , false, );
Test("TestC6", pNode1, , true, -); DestroyTree(pNode1); printf("\n\n");
} // There is only one node in a tree
void TestD()
{
BinaryTreeNode* pNode1 = CreateBinaryTreeNode(); Test("TestD0", pNode1, , true, -);
Test("TestD1", pNode1, , false, );
Test("TestD2", pNode1, , true, -); DestroyTree(pNode1); printf("\n\n");
} // empty tree
void TestE()
{
Test("TestE0", nullptr, , true, -);
Test("TestE1", nullptr, , true, -); printf("\n\n");
} int main(int argc, char* argv[])
{
TestA();
TestB();
TestC();
TestD();
TestE(); system("pause");
}

《剑指offer》第五十四题(二叉搜索树的第k个结点)的更多相关文章

  1. 面试题五十四:二叉搜索树的第K大节点

    方法:搜索二叉树的特点就是左树小于节点,节点小于右树,所以采用中序遍历法就可以得到排序序列 BinaryTreeNode KthNode(BinaryTreeNode pNode ,int k){ i ...

  2. 《剑指offer》第十四题(剪绳子)

    // 面试题:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1]* ...

  3. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

  4. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  5. (剑指Offer)面试题27:二叉搜索树与双向链表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树的定义如下: struct TreeNode{ int val; Tr ...

  6. (剑指Offer)面试题24:二叉搜索树的后序遍历序列

    题目: 输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果,如果是则返回true,否则返回false. 假设输入的数组的任意两个数字都互不相同. 思路: 根据二叉搜索树的后序遍历特点,很 ...

  7. 【剑指offer】面试题24:二叉搜索树的后序遍历序列

    题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 递归 注意,主要就是假定数组为空时结果为fa ...

  8. 【剑指offer】面试题27:二叉搜索树与双向链表

    题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 假设已经处理了一部分(转换了左子树),则得到一个有序的双向链表,现在 ...

  9. 【剑指offer】面试题24:二叉搜索树的兴许前序遍历序列

    分析: 前序: 根 左 右 后序: 左 由 根 二叉搜索树: 左 < 根 < 右 那么这就非常明显了. def ifpost(postArray, start, end): #one or ...

  10. 《剑指offer》— JavaScript(26)二叉搜索树与双向链表

    二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...

随机推荐

  1. 在配置好环境以后,启动tomcat后,出现这个异常

    15-Apr-2019 16:48:13.299 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardConte ...

  2. linux下SVN忽略指定文件/文件夹

    http://www.cnblogs.com/fjping0606/p/4743009.html 1.配置SVN默认编辑器vi ~/.bash_profile最后一行加上:export SVN_EDI ...

  3. scrapy selenium 登陆zhihu

    # -*- coding: utf-8 -*- # 导入依赖包 import scrapy from selenium import webdriver import time import json ...

  4. Restful framework【第二篇】APIView

    安装djangorestframework 方式一:pip3 install djangorestframework 方式二:pycharm图形化界面安装 方式三:pycharm命令行下安装(装在当前 ...

  5. RPMB原理介绍【转】

    本文转载自:https://blog.csdn.net/shenjin_s/article/details/79868375 RPMB介绍:RPMB(Replay Protected Memory B ...

  6. Docker 入门指南——部署常用服务示例

    MongoDB FROM centos:centos7 MAINTAINER The CentOS Project <cloud-ops@centos.org> RUN yum -y up ...

  7. HDU 5938 Four Operations(乱搞)题解

    题意:把'+', '-', '*' 和'/'按顺序插入任意两数字间隔,使得操作得到后计算后最大. 思路:没想到是个水题,打的时候想得太复杂了.这道题其实只要考虑*和/.显然我们要把a*b/c弄到最小. ...

  8. P2272 [ZJOI2007]最大半连通子图

    思路 tarjan的题目 注意是要选出一个点集而不是边集 第一问就是缩点之后最长链,第二问就是有多少个最长链,注意缩点后连边要去重(不然一个链的方案可能会被统计多次) 代码 #include < ...

  9. P1494 [国家集训队]小Z的袜子(莫队算法)

    莫队板子 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <cma ...

  10. 题解——洛谷 P2680 NOIP提高组 2015 运输计划

    树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...