算法第四版习题2.4.24: 用堆有序的二叉树实现一个优先队列,但使用链表结构,每个结点需要三个链接:两个向下,一个向上。要求算法基本操作所需时间为对数级。
二叉树如图:

此算法实现的主要步骤:
1.将新元素插入到最末结点之后,并上浮到合适位置
2. 从二叉树顶端删除最大元素,并将最末结点放到顶端,并下沉顶结点。
此算法的难点在于如何定位最末结点向后一位的结点

一、沈星繁博客中提出的解决办法

维护一个指向最末结点的指针,通过向上回溯来找下一位结点,如图:

具体步骤为:
1.向上回溯一层,判断回溯方向:若为自左路回溯,则右路为后一位结点;若为右路回溯,转为第2步。
2.继续向上回溯,直到回溯方向为左路,然向向右下一层,再沿左路下到底。
3.若向上回溯一直为右路,则会回到顶结点,自顶结点一路向左下到底即可。
此算法逻辑较复杂,而且还要判断回溯方向。具体实现代码可参见下面链接: 沈星繁-算法2.4.

二、我的巧妙算法:

查找某序号结节位置(序号从1开始,自上而下自左到右顺序编号),对于二叉树来说,结点数为N,其下一位就是序号N+1的结点位置。具体查找方法如下:
1.先将序号转为二进制数。
2.此二进制数的位数代表二叉树的层数。自左向右分别为顶结点-2层结点-3层结点-4层结点。除第1位顶结点外,其余每位0代表左结点,1代表右结点。
比如要定位10号结点,先转为二进制为“1010”,定位顺序为:顶结点->左->右->左
此算法遍历的结节数为树的层数,正好为lgN对数级。
代码如下:

public Node seekNode(int x) {String s = Integer.toBinaryString(x);Node seek = top;     for(int i =1; i<s.length(); i++) {if(s.charAt(i)=='0') seek = seek.left;else seek = seek.right;}return seek;}

逻辑清晰,简单高效!

算法2.4.24:查找链表二叉树节点相关推荐

  1. Python基础算法:排序、查找、二叉树

    文章目录 排序算法 1.插入排序 2.交换排序 3.冒泡排序 4.归并排序 4.1.合并两个有序序列 4.2.完整版 查找算法 1.顺序查找 2.二分查找 3.字符串查找 完全二叉树 1.创建树节点[ ...

  2. 查找相交链表相交节点

    目录 查找链表相交节点 情况1: 无环链表相交 情况3:链表相交于入环前及入环节点 情况4:链表A.B相交于入环后或不相交 查找链表相交节点 先判断链表A和B是否有环,并分别找到他们的环入口(loop ...

  3. c++链表获取长度,链表翻转,查找链表倒数第K个节点以及中间点

    c++链表获取长度,链表翻转, 查找链表倒数第K个节点以及中间点 测试数据 ListNode* pHead = new ListNode();pHead->m_key = 1;ListNode* ...

  4. vue 怎么样不重复往数组里插入数据_前端数据结构与算法(1) -二分查找vs二叉树...

    今天给大家开始介绍前端方面的数据结构,刚把vue源码过完就开始数据结构,可见它的地位有多重要.有人说我一前端又不是后端学这个数据结构干嘛,好吧,只能说你还没有这个意识,一是面试很多大厂就会考察,我面试 ...

  5. 查找算法(顺序查找、二分法查找、二叉树查找、hash查找)

    查找功能是数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1)顺 ...

  6. python链表删除尾部节点_python单链表中如何查找和删除节点?

    在之前的文章[python单链表中如何插入和输出节点?]中给大家介绍了单链表是什么,以及如何进行添加节点.输出所以节点.下面本篇文章给大家介绍如何查找和删除节点,希望对大家有所帮助. 如何从单链表中查 ...

  7. PHP 查找链表倒数第i个节点

    1 <?php 2 #查找链表倒数第i个节点,倒数第0个为最后一个节点 3 class Node { 4 public $data = null; 5 public $next = null; ...

  8. 已知一棵完全二叉树存于顺序表sa中,sa.elem[1..sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表。

    已知一棵完全二叉树存于顺序表sa中,sa.elem[1-sa.length]含结点值,试编写算法由此顺序存储结构建立该二叉树的二叉链表. 分析:由二叉树的性质可知,一个下标为i的节点若有左子树,则其左 ...

  9. (数据结构)1.实现二叉树的各种基本运算的算法2.实现二叉树的各种遍历算法3. 由遍历序列构造二叉树4.求二叉树中的结点个数、叶子节点个数、某结点层次和二叉树宽度

    实验内容 1.假设二叉树中的每个结点值为单个字符,采用二叉链存储结构存储.设计一个算法,计算一棵给定二叉树b中的所有单分支结点个数. 2.假设二叉树中的每个结点值为单个字符,采用二叉链存储结构存储.设 ...

最新文章

  1. UNITY statistic中的 SetPass和Batches
  2. 轮距和轴距有什么区别_迈巴赫S级推“婚庆版”?轴距超3.3米 612马力配全时四驱...
  3. .net core redis 驱动推荐,为什么不使用 StackExchange.Redis
  4. 工作183:动态渲染数据 数据在数字字典里面
  5. UOJ.35.[模板]后缀排序(后缀数组 倍增)
  6. iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解
  7. Apache Flink 漫谈系列(06) - 流表对偶(duality)性
  8. C语言学习笔记(五):《C语言深度剖析》笔记
  9. Hibernate基础及配置
  10. 中国人工智能学会通讯——人工智能在各医学亚专科的发展现状及趋势 1.6 结束语...
  11. 倍加福二维码测试2——C#界面程序开发
  12. Redis入门指南 - 电子书下载 -(百度网盘 高清版PDF格式)
  13. CSS:单行文本溢出省略号替代,多行文本溢出省略号替代
  14. 儿童手表语音卡安全吗?
  15. java.sql.BatchUpdateException
  16. OpenCV 角度计算
  17. java12/13新特性
  18. python抓取谷歌指数(Google Trends)
  19. 如何用pdf转jpg软件将pdf转换成图片
  20. apa引用要在文中吗_如何根据 APA 格式排版?

热门文章

  1. java 连接 Pi数据库——piapi方式
  2. mysql中information_schema.columns字段说明
  3. JavaWeb项目 学生后台管理系统 有源码!!(基于MVC设计模式)
  4. lterator遍历
  5. 人民日报评直播问答:百舸争流背后同质化弊病已显现
  6. RUST error: linking with `x86_64-w64-mingw32-gcc` failed: exit code: 1
  7. 思维模型 STAR原则
  8. html中的src路径怎么写,HTML src路径的用法
  9. 虚拟服务器安装ibm mq,IBM MQ 客户端查看服务端消息的工具 WMQTool
  10. 计算机水平怎么填范例,简历表个人能力怎么写(大学生个人获奖情况范例)