当前位置: 首页 > news >正文

Niuke:JZ36.二叉树与双向链表

文章目录

  • Niuke:JZ36.二叉树与双向链表
      • 题目描述
      • 示例
      • 思路分析
      • 代码实现

Niuke:JZ36.二叉树与双向链表

题目描述

描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

在这里插入图片描述

注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出
输入描述
二叉树的根节点
返回值描述
双向链表的其中一个头节点。

示例

示例1

输入: {10,6,14,4,8,12,16} 复制 返回值: From left to right
are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4; 复制 说明:
输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。

示例2

输入: {5,4,#,3,#,2,#,1} 复制 返回值: From left to right are:1,2,3,4,5;From
right to left are:5,4,3,2,1; 复制 说明:
5
/
4
/
3
/
2
/
1 树的形状如上图

思路分析

1: 通过中序遍历,让先递归的结点在后递归的前面,每次左递归之后将prev与当前结点root的左指针指向上一层函数栈帧递归的结点,让上一层函数栈帧树结点的右指针指向当前结点,故而在每一层递归时应该保存当前结点的
位置.
2: 当将二叉树连接成双向链表后,此时的pRootOfTree依旧指向树的根结点,此时应该将pRootOfTree指向双向链表表头.
注意:
1: 在对指针进行访问的时候一定要考虑指针不为空的情况.
2: 为了回溯时让上一层的prev依旧有效,此时的形参prev最好用引用.
3: 当第一层中序递归遍历结束,编译器会主动返回到上一层函数栈帧,也就是中序遍历该开始的地方.

代码实现

class Solution {
public:void InorderConvert( TreeNode* cur,TreeNode*& prev ){if( cur == nullptr )return;//如果不是空,就先往左子树遍历。InorderConvert(cur->left,prev);//走到这,第一个结点就为4.cur->left = prev;if( prev ){//执行这一步时prev不能指向空。prev->right = cur;}//更新prev;prev = cur; InorderConvert( cur->right,prev);}TreeNode* Convert(TreeNode* pRootOfTree) {TreeNode* prev = nullptr;InorderConvert(pRootOfTree,prev);//题目要求返回链表的头。TreeNode* head = pRootOfTree;if( head){while( head->left ){head = head->left;}}return head;}
};
http://www.lryc.cn/news/56002.html

相关文章:

  • javaScript---读懂promise、async/await
  • 【Linux】TCP编程流程
  • SuperMap iDesktop 下载安装,生成本地瓦片,以及发布本地瓦片服务
  • 【ONE·Data || 常见排序说明】
  • 本节作业之跟随鼠标的天使、模拟京东按键输入内容、模拟京东快递单号查询
  • ChatGPT 被大面积封号,到底发生什么了?
  • 教你精通JavaSE语法之第十一章、认识异常
  • display、visibility、opacity隐藏元素的区别
  • Linux Shell 实现一键部署tomcat10+java13
  • 软硬皆施,WMS仓库管理系统+PDA,实现效率狂飙
  • DJ3-2 传输层(第二节课)
  • FrIf-FrIf功能模块概述和与底层驱动的交互
  • 【LeetCode】前 K 个高频元素(堆)
  • Java ---多态
  • 13个程序员常用开发工具用途推荐整理
  • TCP分包和粘包
  • 手撕深度学习中的优化器
  • 英文打字小游戏
  • PCB生产工艺流程三:生产PCB的内层线路有哪7步
  • 算法竞赛进阶指南0x61 最短路
  • [学习篇] Autoreleasepool
  • 晶体基本知识
  • 免费CRM如何进行选择?
  • 关于金融类iOS套壳上架,我帮你总结了这些经验
  • 4年功能测试月薪9.5K,3个月时间成功进阶自动化,跳槽涨薪6k后我的路还很长...
  • python url解码详解
  • leetcode102:二叉树的层序遍历
  • 深度学习openMMLab的介绍和使用
  • 【vue2】axios请求与axios拦截器的使用详解
  • 文件上传都发生了啥