文章目录

  • 题目描述
  • 思路 && 代码
    • 1. 非原地算法
    • 2. 原地算法
    • 二刷

题目描述

  • 谈到二叉搜索树,那就得考虑考虑中序遍历啦~
  • 这道题对中序遍历的理解提升很有好处!

思路 && 代码

1. 非原地算法

  • 最简单的做法,依赖ArrayList,但是不满足原地算法的要求
  • 只要通过中序遍历,把树上结点存储到ArrayList中,再通过下标进行操作即可。
/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node() {}public Node(int _val) {val = _val;}public Node(int _val,Node _left,Node _right) {val = _val;left = _left;right = _right;}
};
*/
class Solution {ArrayList<Node> list = new ArrayList<>();public Node treeToDoublyList(Node root) {if(root == null) {return null;}// 先中序遍历存储结点midErgodic(root);// 接着逐个改变指针for(int i = 0; i < list.size(); i++) {if(i == 0) {list.get(i).left = list.get(list.size() - 1);}else {list.get(i).left = list.get(i - 1);}if(i == list.size() - 1) {list.get(i).right = list.get(0);}else {list.get(i).right = list.get(i + 1);}}return list.get(0);}public void midErgodic(Node root) {if(root == null) {return;}midErgodic(root.left);list.add(root);midErgodic(root.right);}
}

2. 原地算法

  • 和1异曲同工,但是相对更加巧妙!
  • Node first:存储最左边的**“首位”**结点,用于最后的处理
  • Node pre:在递归中辅助使用,递归结束后指向**“末尾”**结点
  • 同样是中序遍历,要注意好 cur 、pre 的处理
  • cur 是局部变量;pre、first 是全局变量
// 很经典的中序遍历题~
class Solution {Node first, pre;public Node treeToDoublyList(Node root) {// 空树情况if(root == null) {return null;}// 开启dfsdfs(root);// dfs结束,此时 pre 就是最右边(最大)节点.// 进行头 - 尾节点的处理first.left = pre;pre.right = first;return first;}public void dfs(Node cur) {if(cur == null) {return;}// 中序dfs(cur.left);// right 的处理,没有 pre 节点的是 firstif(pre != null) {pre.right = cur;}else {first = cur;}// left 的处理cur.left = pre;// 维护 pre 结点pre = cur;dfs(cur.right);}
}

二刷

  • 中序遍历 + 全局变量
class Solution {Node head = null;Node pre = null;public Node treeToDoublyList(Node root) {if(root == null) {return null;}dfs(root);head.left = pre;pre.right = head;return head;}public void dfs(Node root) {if(root == null) {return;}treeToDoublyList(root.left);if(pre == null) {head = root;}else {pre.right = root;}root.left = pre;pre = root;treeToDoublyList(root.right);}
}

【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)相关推荐

  1. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  2. 【Java】 剑指offer(36) 二叉搜索树与双向链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...

  3. [剑指offer] 36. 二叉搜索树与双向链表

    题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 需要返回双向链表最左侧的节点. 思路 1 排序链表:利用二叉搜索树的中序遍 ...

  4. 2021-08-19剑指 Offer 36. 二叉搜索树与双向链表

    我的思路: 前序遍历保证链表的有序性,并且在这个遍历的同时调整指针的指向 class Solution {public:Node* treeToDoublyList(Node* root) {if(r ...

  5. 【算法】剑指 Offer 36. 二叉搜索树与双向链表

    1.概述 地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ /* // De ...

  6. 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列

    [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...

  7. 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点

    [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...

  8. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  9. 剑指offer之二叉搜索树和双向链表

    1 问题 比如我们搜索二叉树如下,我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时 ...

最新文章

  1. 特斯拉全新自动驾驶芯片最强?英伟达回怼,投资者用脚投票
  2. 余承东和张小龙背后的故事:成年人,请远离线性努力
  3. 神经网络不收敛的 11 个原因,加实践感悟
  4. 旧金山漫记(四):夜困火车站
  5. 日志规范之slf4j整合JDK14以及Simple的使用
  6. 加入docker管理员_如何使系统管理员和开发人员同意Docker
  7. 设计灵感|C4D卡通角色设计作品,你想要的模型集设都有
  8. SAP License:SAP中的产量法折旧计算
  9. 深度学习基础(一) —— softmax 及 logsoftmax
  10. linux安装telnet客户端_Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!
  11. dijkstra算法学习笔记
  12. Android设置标题栏图标
  13. opera官方教程 预订一
  14. Android开发问题汇总
  15. RAC修改IP(public/virtual/scan)
  16. SpringCloud 配置管理:Nacos
  17. 与孔子同世之闻人少正卯
  18. 通过vdi备份linux,centos/ubuntu挂载vmdk、 vdi为块设备的方法(非vdfuse)
  19. Hexo主题修改Next.Mist
  20. 被吹上天的802.11ac Wave2到底好在哪?还有,Wave1哪去了?

热门文章

  1. java修改list中对象的值_Java中List集合的一点总结
  2. c语言编程安全队列,C语言编程队列的实现
  3. android dp sp px_Android屏幕适配★★重点盘点★★
  4. 华为手机怎么使用读卡器_华为手机使用小窍门
  5. linux suse 共享目录_SUSE环境下YAST源(连接共享目录)
  6. Visual Studio 2013运行的结果一闪而过
  7. MATLAB GUI的CreateFcn如何创建
  8. CSAPP--整数的运算
  9. Pycharm下安装Tensorflow
  10. Retrofit学习入门