【LeetCode笔记】剑指 Offer 36. 二叉搜索树与双向链表(Java、二叉树、链表、原地算法)
文章目录
- 题目描述
- 思路 && 代码
- 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、二叉树、链表、原地算法)相关推荐
- 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表
[LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...
- 【Java】 剑指offer(36) 二叉搜索树与双向链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不 ...
- [剑指offer] 36. 二叉搜索树与双向链表
题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 需要返回双向链表最左侧的节点. 思路 1 排序链表:利用二叉搜索树的中序遍 ...
- 2021-08-19剑指 Offer 36. 二叉搜索树与双向链表
我的思路: 前序遍历保证链表的有序性,并且在这个遍历的同时调整指针的指向 class Solution {public:Node* treeToDoublyList(Node* root) {if(r ...
- 【算法】剑指 Offer 36. 二叉搜索树与双向链表
1.概述 地址:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/ /* // De ...
- 【LeetCode】剑指 Offer 33. 二叉搜索树的后序遍历序列
[LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 文章目录 [LeetCode]剑指 Offer 33. 二叉搜索树的后序遍历序列 package offer;public cl ...
- 【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
[LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 文章目录 [LeetCode]剑指 Offer 54. 二叉搜索树的第k大节点 一.中序遍历(提前返回) 一.中序遍历(提前返回) ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 剑指offer之二叉搜索树和双向链表
1 问题 比如我们搜索二叉树如下,我们需要变成双向链表 2 分析 我们知道这个变成双向链接的时候是按照树的中序遍历打印的,我们只需要在中序遍历打印的时候操作该节点,我们可以用临时变量保存这个节点,同时 ...
最新文章
- 特斯拉全新自动驾驶芯片最强?英伟达回怼,投资者用脚投票
- 余承东和张小龙背后的故事:成年人,请远离线性努力
- 神经网络不收敛的 11 个原因,加实践感悟
- 旧金山漫记(四):夜困火车站
- 日志规范之slf4j整合JDK14以及Simple的使用
- 加入docker管理员_如何使系统管理员和开发人员同意Docker
- 设计灵感|C4D卡通角色设计作品,你想要的模型集设都有
- SAP License:SAP中的产量法折旧计算
- 深度学习基础(一) —— softmax 及 logsoftmax
- linux安装telnet客户端_Redis 6.0 的客户端缓存是怎么肥事?一文带你了解!
- dijkstra算法学习笔记
- Android设置标题栏图标
- opera官方教程 预订一
- Android开发问题汇总
- RAC修改IP(public/virtual/scan)
- SpringCloud 配置管理:Nacos
- 与孔子同世之闻人少正卯
- 通过vdi备份linux,centos/ubuntu挂载vmdk、 vdi为块设备的方法(非vdfuse)
- Hexo主题修改Next.Mist
- 被吹上天的802.11ac Wave2到底好在哪?还有,Wave1哪去了?
热门文章
- java修改list中对象的值_Java中List集合的一点总结
- c语言编程安全队列,C语言编程队列的实现
- android dp sp px_Android屏幕适配★★重点盘点★★
- 华为手机怎么使用读卡器_华为手机使用小窍门
- linux suse 共享目录_SUSE环境下YAST源(连接共享目录)
- Visual Studio 2013运行的结果一闪而过
- MATLAB GUI的CreateFcn如何创建
- CSAPP--整数的运算
- Pycharm下安装Tensorflow
- Retrofit学习入门