1. 题目

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。


特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

2. 解题

  • 中序遍历
  • 循环解法

循环写法总结如下:

class Solution {public:Node* treeToDoublyList(Node* root) {if(!root)return NULL;bool foundHead = false;Node* head, *prev = NULL;stack<Node*> s;while(root || !s.empty()){while(root){s.push(root);root = root->left;}if(!foundHead){head = s.top();foundHead = true;}root = s.top()->right;if(prev)prev->right = s.top(); s.top()->left = prev;prev = s.top();s.pop();}head->left = prev;//prev存的是最后一个prev->right = head;return head;}
};

-递归解法

class Solution {Node *head = NULL, *prev = NULL, *tail = NULL;
public:Node* treeToDoublyList(Node* root) {if(!root)return NULL;inorder(root);head->left = tail;tail->right = head;return head;}void inorder(Node* root){if(!root)return;inorder(root->left);if(!prev)head = root;elseprev->right = root;root->left = prev;prev = root;tail = root;inorder(root->right);}
};

剑指Offer - 面试题36. 二叉搜索树与双向链表(中序循环/递归)相关推荐

  1. 剑指offer面试题36. 二叉搜索树与双向链表(中序遍历)(递归)

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 思路 详见链接 代码 #class Node: # def __ini ...

  2. 剑指offer面试题[27]-二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /* struct TreeNode {int val;struct Tr ...

  3. 剑指Offer - 面试题33. 二叉搜索树的后序遍历序列(递归)

    1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树:5/ \2 6 ...

  4. 剑指Offer - 面试题54. 二叉搜索树的第k大节点(二叉树循环遍历)

    1. 题目 给定一棵二叉搜索树,请找出其中第k大的节点. 示例 1: 输入: root = [3,1,4,null,2], k = 13/ \1 4\2 输出: 4示例 2: 输入: root = [ ...

  5. 剑指offer面试题54. 二叉搜索树的第k大节点(逆中序遍历)

    题目描述 给定一棵二叉搜索树,请找出其中第k大的节点. 思路 详见链接 代码 class Solution:def kthLargest(self, root:TreeNode, k:int)-> ...

  6. 剑指offer面试题33. 二叉搜索树的后序遍历序列(二叉树)(递归)

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 思路 详见链接 代码 class Sol ...

  7. 剑指offer(C++)-JZ36:二叉搜索树与双向链表(数据结构-树)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示 数据范围:输 ...

  8. 剑指offer(牛客)---26.二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. /** public class TreeNode {int val = ...

  9. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列

    剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...

最新文章

  1. 计算机应用基础形成性考核册答案,2019年最新(电大秋)计算机应用基础形成性考核册题目及答案.doc...
  2. 《c语言从入门到精通》看书笔记——第16章 网络套接字编程(上)——网络
  3. 计算机操作系统实验一,计算机操作系统实验一.doc
  4. 「分布式系统理论」系列专题
  5. github 如何设置项目的语言显示
  6. c语言课程设计2018,C语言课程设计报告(2018)——学生管理系统(17页)-原创力文档...
  7. 各种封装——封装getClass
  8. Jenkins打卡Day19-Jenkins重启关闭服务
  9. C# 异步定时器,可以重载; System.Timers.Timer
  10. 【INDIRECT】函数教你制作多级下拉菜单
  11. java 算法,Java的十大算法你掌握好了吗?
  12. H3C模拟器配置VLAN
  13. 已解决-MacBook pro/MacBook air上安装Windows10双系统教程
  14. java excel 合并单元格
  15. HBase 怎样负载均衡?
  16. JADE盲源分离算法附MATLAB代码
  17. 艺赛旗(RPA)Python 读写 ini 配置文件
  18. leetcode 5233 Maximum Profit in Job Scheduling
  19. fbd 文件的研究笔记
  20. oracle左补全函数,Oracle 左侧补齐函数lpad 函数 (不积跬步,无以至千里)

热门文章

  1. smart gesture安装失败_WinCC flexible SMART V3 SP2安装步骤以及常见错误解决方法
  2. 深入理解C++中的explicit关键字
  3. oracle中pga指什么,oracle学习SGA跟PGA理解
  4. plsql中文乱码 显示问号
  5. 程序员经常说的「设计模式」到底是什么?
  6. WIN10 vagrant和virtualbox虚拟机和一键搭建lnmp环境配置thinkphp虚拟主机
  7. 用JS来create结点,纯JS代码生成html页面(作业练习)
  8. c#将list集合转换为datatable的简单办法
  9. Android心得8--Internet
  10. vector中的reserve() 与 resize()