文章目录

  • 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;}
};

Niuke:JZ36.二叉树与双向链表相关推荐

  1. 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

    一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...

  2. 《程序员代码面试指南》第二章 链表问题 搜索二叉树转换为双向链表

    样例 树的中序遍历:1 2 3 4 5 6 7 ,转换后双向链表的遍历:1 2 3 4 5 6 7 java代码 /*** @Description:搜索二叉树转换为双向链表* @Author: li ...

  3. 剑指Offer之二叉树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 参考博客:https://www.cnblogs.com/yi- ...

  4. LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List--转换二叉树为双向链表--Java,C++,Python解法

    题目地址:Convert Binary Search Tree to Sorted Doubly Linked List - LeetCode Convert a BST to a sorted ci ...

  5. 关于双向链表和二叉树链表的区别

    双向链表和二叉树链表区别为:节点指针数量不同.访问方向权限不同.节点存储内容不同.双向链表和二叉树链表都能从链表中的任何一个结点出发能找到任何其他结点.都用来存放线性数组中的数据元素. 一.节点指针数 ...

  6. 二叉树类图_数据结构(十四)——二叉树

    数据结构(十四)--二叉树 一.二叉树简介 1.二叉树简介 二叉树是由n(n>=0)个结点组成的有序集合,集合或者为空,或者是由一个根节点加上两棵分别称为左子树和右子树的.互不相交的二叉树组成. ...

  7. 二叉树的中序遍历 [递归 迭代]

    中序遍历的递归 & 迭代 前言 一.二叉树的中序遍历 二.递归 & 迭代 1.递归版 2.迭代(断左子树版) 3.迭代(root迭代版) 4.mirror(O(1)空间版) 总结 参考 ...

  8. 数据结构与算法:二叉树专题

    数据结构与算法:二叉树专题 前言 前提条件 基础知识 二叉树链式存储结构 二叉树中序遍历 二叉树层序遍历 常见编程题 把一个有序整数数组放到二叉树中 逐层打印二叉树结点数据 求一棵二叉树的最大子树和 ...

  9. 树的基本概念以及java实现二叉树(一)

    前言 作为一个程序员,要了解最基本的数据结构的.本文是我在学习了树后作的总结文章,本节大致可以总结为: 什么是树 树的基本性质(专有名词) 什么是二叉树 二叉树的基本性质 二叉树的存储结构 文章传送门 ...

最新文章

  1. redis分布式锁-基本概念与实现方式对比
  2. Spring+Mybatis 多数据源配置
  3. c malloc 头文件_干货笔记 | C/C++笔试面试详细总结(二)
  4. go build编译不同环境
  5. html的数据类型有哪些,数据库数据类型有哪些
  6. ocx控件 postmessage消息会消失_APP控件之二——弹框
  7. cordova与android通信_5:Cordova与原生交互--传值
  8. opencv sobel算子的理解
  9. 【光学】基于matlab GUI光栅实验【含Matlab源码 1176期】
  10. 【jpype】pycharm中配置jpype
  11. Weakly Supervised Instance Segmentation using Class Peak Response论文复现以及遇到的问题
  12. ubuntu安装deb文件
  13. 学校计算机ip设置路由器,路由器怎么设置ip 如何设置路由器ip地址【详细步骤】...
  14. 10 大白帽黑客专用的 Linux 操作系统
  15. 程序人生 - 座位险和驾乘险有什么区别,买了后者还需要前者吗?
  16. 学术论文投稿第五弹——如何写Discussion
  17. 在计算机系统中存储容量最大的设备,计算机系统中存储容量最大的部件是().
  18. STM32学习记录0002-STM32初探
  19. 常用眼底图像数据集简介及下载--糖尿病视网膜病变 EyePacs,APTOS2019,STARE数据集
  20. 第七届全国计算机大赛作品,常熟理工学院新闻网

热门文章

  1. ubuntu环境下U盘的挂载和卸载
  2. 《AUTOSAR谱系分解(ETAS工具链)》之总目录
  3. 金山中等专业学校计算机,江苏省金山中等专业学校2021年招生计划
  4. 基于springboot+vue的4S店车辆销售保养维修管理系统
  5. telematics product and company in China
  6. 2019双十一购物测试
  7. 糖尿病诊断模型训练与结果预测
  8. [存储]NVMe-7-控制器架构
  9. 深入 Android 源码系列(一)
  10. 微服务与领域驱动设计,架构实践总结