今天有点时间, 根据我下面的想法写了代码.

node_t*

find(node_t* t, int k)

{

if(t == NULL)

return NULL;

/* t1 is used to record the parent of the last node

* which is right child of its parent

*/

t1 = NULL;

do{

if(k < t->v)

t = t->l;

else if(k = t->v)

break;

else{

t1 = t;

t = t->r;

}

}while(t != NULL);

if(t == NULL || t->l == NULL)

return t1;

/* max(t->l) */

t = t->l;

while(t->r != NULL)

t = t->r;

return t;

}

以前的答案

遍历的话, 时间复杂度O(n). 这里有O(lgn)的方法.

就是求 bst的 某节点的 前驱.查询bst, 如果找到 key的节点, 查此节点的前驱; 否则, 可以知道此key 应该插入的节点位置, 查此位置的前驱.

求bst节点 n的 前驱:

如果左子树不为null, 则前驱为 max(n->left);

否则, 递归n的 父节点p; 如果p为根节点, 则前驱为 根节点;

否则, 如果p为其父节点的右节点, 则前驱为 p;

否则, p = p->p; 重复step2-4.

如果bst节点是有父节点信息的. 很简单:

node_t*

max(node_t* r)

{

while(r->r != NULL)

r = r->r;

return r;

}

node_t*

predecessor(node_t* r)

{

if(r->l != NULL)

return max(r->l);

node_t *p = r->p;

while(p != NULL && r != p->r){

r = p;

p = p->p;

}

return p;

}

这里时间O(lgn).

没有父节点信息, 则需要辅助内存. 这里可以用一个 辅助栈 把bst查询 的路径节点都记录下来, 然后就可以 像上述算法一样, 递归查询节点的 父节点了. 时间O(lgn), 空间O(lgn).

当然我们还可以在bst查询时, 记录下其 路径上的 最后一个 "为其父节点的右节点的节点", 这样时间O(lgn), 空间O(1).

二叉树查找最大最小值c语言,用C语言实现二叉排序树查找小于关键字key的最大节点的函数...相关推荐

  1. 《数据结构(C语言版)》学习笔记08 查找

    目录 写在前面 一.顺序查找 1.1 普通的无序查找方法 1.2 改进的无序查找--哨兵 1.3 有序的顺序查找 二.折半查找/二分查找 三.分块查找 四.二叉搜索树 五.平衡二叉搜索树 六.B树 七 ...

  2. 平衡查找树C语言程序,C语言数据结构之平衡二叉树(AVL树)实现方法示例

    本文实例讲述了C语言数据结构之平衡二叉树(AVL树)实现方法.分享给大家供大家参考,具体如下: AVL树是每个结点的左子树和右子树的高度最多差1的二叉查找树. 要维持这个树,必须在插入和删除的时候都检 ...

  3. vector 查找最大最小值,且求最大值或者最小值在容器中的位置

    文章目录 前言 一 vector 查找最大最小值,及其位置 前言 在项目中经常会用到对vector容器中的数据求最大值或者最小值,这里简单总结下vector的常用方法,方便后续快速查找回顾. 一 ve ...

  4. c语言链表查找的代码与题目,链表的C语言实现之单链表的查找运算_c语言

    建立了一个单链表之后,如果要进行一些如插入.删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作.单链表的基本运算包括:查找.插入和删除.下面我们就一一介绍这三种基本运算的算法,并结合 ...

  5. mysql查找最大值最小值_查找两个8位数字的最大值| 8086微处理器

    mysql查找最大值最小值 Problem statement: 问题陈述: To find maximum of two 8-bit numbers using 8086 Microprocesso ...

  6. C语言二叉树实验报告流程图,二叉树的建立与遍历实验报告(c语言编写,附源代码).doc...

    二叉树的建立与遍历实验报告(c语言编写,附源代码).doc 第 1 页,共 9 页二叉树的建立与遍历实验报告级 班 年 月 日 姓名 学号_ 1实验题目建立一棵二叉树,并对其进行遍历(先序.中序.后序 ...

  7. (46)System Verilog数组查找最大最小值

    (46)System Verilog数组查找最大最小值 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog数组查找最大最小值 5)结语 1 ...

  8. java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

    二叉排序树的定义: 二叉排序树满足以下三个性质(BST性质): <1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值 <2>若它的右子树非空,则右子树上所有节点的值均 ...

  9. c语言统计二维数组中数字出现次数,C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例 题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...

最新文章

  1. UA MATH567 高维统计IV Lipschitz组合8 随机投影与John-Lindenstrauss引理
  2. 盘点最经典的外包案例
  3. 热插拔服务器电源维修,无需关停系统即可热插拔,TE Connectivity推出滑轨电源连接器...
  4. webstorm配置,快捷键console.log,中文字体,快捷键配置等
  5. 茶颜只有“霸蛮”,没有悦色
  6. opencv-api matchTemplate
  7. ROS学习笔记八:创建ROS msg和srv
  8. aspnet_regsql.exe 工具参数解析
  9. 【Java与智能设备】 CH05_2 Intent启动内置程序
  10. 网站编辑,你们的名字叫搬运工?
  11. 洛谷 P1878 舞蹈课(优先队列 + 双链表)
  12. 细菌感染和抗生素使用
  13. 新浪微博开发平台接入流程(1)---注册应用
  14. mysql使得df和du不一致_df和du显示的磁盘空间使用情况不一致的原因及处理
  15. 滤波器原理及其作用计算机网络,什么是滤波器?滤波器原理及其作用是什么?...
  16. 学计算机进富士康,大学生进富士康上班工资多高,有发展前景吗?看看前辈们怎么说...
  17. 续写千倍币神话,PlusFo到底是何方神圣?
  18. 金融行业需要什么样的数据库?
  19. ORACLE修改字段长度!
  20. java 案例:二月天;求月一共有多少天

热门文章

  1. 基于JAVA+SpringMVC+MYSQL的鲜花销售平台
  2. 【链接】Eclipse中快速打开文件所在的文件夹位置
  3. 游戏开发中常用的设计模式
  4. 模糊查询时,页面没有数据,数据库编辑器里可以正常显示数据
  5. 70个经典的 Shell 脚本面试问题
  6. OS开发UI篇—Quartz2D使用(截屏)
  7. iOS开发隐藏tabBar的问题
  8. [outlook]打开以后就自动进入安全模式的解决方法。Outlook start in safe mode.
  9. 知道一点怎么设直线方程_直线初步
  10. 记事本可以编辑html语言吗,笔记本win7系统使用记事本编辑和运行html代码的方法...