剑指 Offer 36. 二叉搜索树与双向链表(中等)
时间:2021-08-31
本文章向大家介绍剑指 Offer 36. 二叉搜索树与双向链表(中等),主要包括剑指 Offer 36. 二叉搜索树与双向链表(中等)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
通过率 65.4%
题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
思路:
深搜,由二叉搜索树(左子树节点都小于根节点,右子树节点都大于根节点)的特性可知,按中序遍历二叉树就能得到一个升序序列,维护前驱节点pre和当前节点cur,有两个注意点:
- root为空树时直接原样返回
- pre不能写在递归参数里,要写在外面;另外,方便起见,把dfs函数写在treeToDoublyList()函数里面,否则写在外面的话,每次调用treeToDoublyList()函数都须先初始化pre和head,否则后一个测试案例的结果会受到前一个测试案例的影响
1 /*JavaScript*/ 2 /** 3 * // Definition for a Node. 4 * function Node(val,left,right) { 5 * this.val = val; 6 * this.left = left; 7 * this.right = right; 8 * }; 9 */ 10 /** 11 * @param {Node} root 12 * @return {Node} 13 */ 14 var treeToDoublyList = function(root) { 15 if(!root) return root 16 17 let head = null 18 let pre = null 19 20 var dfs = function(cur) { 21 if(!cur) return 22 dfs(cur.left) 23 // 让head指向链表头节点 24 if(pre) pre.right = cur 25 else head = cur 26 cur.left = pre 27 pre = cur 28 dfs(cur.right) 29 } 30 31 dfs(root) 32 head.left = pre 33 pre.right = head 34 return head 35 };
原文地址:https://www.cnblogs.com/wwqzbl/p/15209013.html
- mybatis xml mapper 文件中 if-else 写法
- 深入探索Scala的Option
- 在Clion的IDE中指定命令行参数
- CentOS6 安装并破解Jira 7
- Martin Odersky访谈录所思
- 解决Boost库链接出错问题
- 引入Option优雅地保证健壮性
- java正则校验,密码必须由字母和数字组成
- Spring Boot集成JasperReports生成PDF文档
- Redux框架reducer对状态的处理
- 使用Spring Cloud Security OAuth2搭建授权服务
- Nginx性能优化
- linux 如何正确的关闭mongodb
- 运用Aggregator模式实现MapReduce
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP获取ttf格式文件字体名的方法示例
- PHP iconv()函数字符编码转换的问题讲解
- 使用PHP反射机制来构造"CREATE TABLE"的sql语句
- PHP PDOStatement::fetch讲解
- 解决Pytorch自定义层出现多Variable共享内存错误问题
- PHP观察者模式定义与用法实例分析
- ThinkPHP5.1表单令牌Token失效问题的解决
- PHP设计模式之工厂模式(Factory Pattern)的讲解
- keras K.function获取某层的输出操作
- 浅谈sklearn中predict与predict_proba区别
- 解决Keras中循环使用K.ctc_decode内存不释放的问题
- PDO::getAvailableDrivers讲解
- PDO::_construct讲解
- Yii2.0实现的批量更新及批量插入功能示例
- PDO::inTransaction讲解