1 问题

给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5  3  7  2  4  6  8 中,按结点数值大小顺序第三个结点的值为4。

2 分析

二叉树定义:二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

具体分析:按照定义,我们不难知道二叉查找树如果按照数的中序遍历,我们可以得到单调递增的排列数,我们需要找到第K个节点,也就是中序遍历树的第K个节点。

我们可以通过递归中序遍历求解答,也可以通过通过栈来实现树的中序遍历

3 代码实现

#include <iostream>
#include <stdlib.h>
#include <stack>using namespace std;typedef struct Tree
{int value;struct Tree* left;struct Tree* right;
} Tree;Tree* getNode(Tree* node, int k)
{if (k <= 0){std::cout << "输入的k值不合法" << std::endl;return NULL;}int count;if (node == NULL)return NULL;getNode(node->left, k);//std::cout << "value is " << node->value <<std::endl;count++;if (count == k){return node;}getNode(node->right, k);return node;
}Tree* getNode1(Tree* node, int k)
{if (k <= 0){std::cout << "输入的k值不合法" << std::endl;return NULL;}if (node == NULL)return NULL;std::stack<Tree *> stack;Tree *p = node;int count = 0;while (p != NULL || !stack.empty()){if (p != NULL){stack.push(p);p = p->left;}else{Tree *value = stack.top();//std::cout << "value is " << value->value << std::endl;count++;//这里需要pop函数弹出来,不然永远都是二叉树的最左下角的值stack.pop();if (k == count){return value;}p = value->right;}}return NULL;
}int main() {/***    42         61     3   5     7     **/Tree *node1 , *node2 , *node3, *node4, *node5, *node6, *node7;node1 = (Tree *)malloc(sizeof(Tree));node2 = (Tree *)malloc(sizeof(Tree));node3 = (Tree *)malloc(sizeof(Tree));node4 = (Tree *)malloc(sizeof(Tree));node5 = (Tree *)malloc(sizeof(Tree));node6 = (Tree *)malloc(sizeof(Tree));node7 = (Tree *)malloc(sizeof(Tree)); node1->value = 4;node2->value = 2;node3->value = 6;node4->value = 1;node5->value = 3;node6->value = 5;node7->value = 7;node1->left = node2;node1->right = node3;node2->left = node4;node2->right = node5;node3->left = node6;node3->right = node7;node4->left = NULL;node4->right = NULL;node5->left = NULL;node5->right = NULL;node6->left = NULL;node6->right = NULL;node7->left = NULL;node7->right = NULL;Tree *result = getNode(node1, 4);if (result != NULL){std::cout << "result is " << result->value << std::endl;}Tree *result1 = getNode1(node1, 4);if (result1 != NULL){std::cout << "result1 is " << result1->value << std::endl;}return 0;
}

4 运行结果

result is 4
result1 is 4

5 总结

我们用栈(stack)进行中序遍历的时候,我们不应该一开始就把树的顶部节点压入栈,这个时候基本上后面再在while循环里面做top操作基本上无解,然后我们既然是要执行左 中 右效果,我们需要单独定义一个遍历保存第一个节点,然后依次压入左孩子节点,然后如果是空就不压进去,而要执行获取顶部元素,这个就是我们需要的值,然后还有把这个元素进行弹出来(pop)操作,然后把这个值的右孩子节点压入栈,这样就可以保证是左 中 右打印值的效果。

剑指offer之二叉搜索树的第K个节点相关推荐

  1. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

  2. 剑指offer:二叉搜索树的第k个结点(中序遍历)

    1. 题目描述 /*给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. */ 2. 思路 中序遍历二叉搜索树,第K个就是结 ...

  3. 剑指offer之二叉搜索树的第K个结点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 解题思路 二叉搜索树的中序遍历是顺序结构,利用中序遍历即可求 ...

  4. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  5. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  6. 剑指offer之二叉搜索树的后序遍历序列

    剑指offer之二叉搜索树的后序遍历序列 欢迎关注作者博客 简书传送门 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个 ...

  7. 剑指 Offer 33. 二叉搜索树的后序遍历序列

    剑指 Offer 33. 二叉搜索树的后序遍历序列 原始题目链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian- ...

  8. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  9. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

最新文章

  1. Python标准库——collections模块的Counter类
  2. 简单的JSP登录程序
  3. 堆栈指针ESP和EBP
  4. build/envsetup.sh脚本分析
  5. mysql删除数据太多卡死解决办法
  6. html - meta name=viewport content=XX/ 标签常见属性及说明
  7. 剑指offer之礼物的最大值
  8. 商城左侧菜单栏网页模板
  9. URAL 2081 Faulty dial
  10. 摘自缪雪峰的博客的JavaScript个人笔记(3)
  11. NYOJ4——ASCII码排序
  12. 408考研复试之计算机组成原理笔记第一二三章
  13. html数值计算计算
  14. 计算机程序员的英文简历,电脑程序员个人英文简历范文
  15. 软件测试 等价类/边界值分析/随机数生成
  16. 色彩混合模型——两种三原色
  17. java计算机毕业设计民航售票管理系统源代码+数据库+系统+lw文档
  18. RDF 1.1 N-Triples
  19. Hadoop和HBase集群的JMX监控
  20. CSS实现的带头像的彩色垂直菜单源码

热门文章

  1. 业务功能中包含邮件发送,怎么测试?
  2. .NET 6新特性试用 | DateOnly和TimeOnly类型
  3. 微软推出 .NET 官方社区论坛
  4. SignalR在React/Go技术栈的实践
  5. 12 个问题搞懂 Redis
  6. ASP.NET Core自定义响应内容
  7. ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目
  8. 如何运用并行编程Parallel提升任务执行效率
  9. 抢鲜体验.NET6 Preview1,配上Docker简直停不下来!
  10. 基于.NetCore3.1搭建项目系列 —— 认证授权方案之Swagger加锁