【LeetCode】426. Convert Binary Search Tree to Sorted Doubly Linked List 解题报告 (C++)
- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客:http://fuxuemingzhu.cn/
题目地址:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
题目描述
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers as synonymous to the previous and next pointers in a doubly-linked list.
Let’s take the following BST as an example, it may help you understand the problem better:

We want to transform this BST into a circular doubly linked list. Each node in a doubly linked list has a predecessor and successor. For a circular doubly linked list, the predecessor of the first element is the last element, and the successor of the last element is the first element.
The figure below shows the circular doubly linked list for the BST above. The “head” symbol means the node it points to is the smallest element of the linked list.

Specifically, we want to do the transformation in place. After the transformation, the left pointer of the tree node should point to its predecessor, and the right pointer should point to its successor. We should return the pointer to the first element of the linked list.
The figure below shows the transformed BST. The solid line indicates the successor relationship, while the dashed line means the predecessor relationship.

题目大意
将一个BST转换为有序的双向链表,并返回该双向链表的头指针。
解题方法
递归
看到BST就想到中序遍历是有序的。
中序遍历有两种做法:递归和迭代。递归的方式做法比较常见。
这里相对于普通的中序遍历的修改是对当前节点进行判断,如果有pre的话需要修改pre和当前node的指针。head节点的定义是左下角节点,也是真正处理的第一个节点。last节点是最后的一个节点。
当递归结束之后,需要把head和last拼接到一起。
C++代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root) return nullptr;
Node* head = nullptr;
Node* pre = nullptr;
Node* last = nullptr;
inorder(root, head, pre, last);
last->right = head;
head->left = last;
return head;
}
void inorder(Node* node, Node* &head, Node* &pre, Node* &last) {
if (!node) return;
inorder(node->left, head, pre, last);
if (pre) {
pre->right = node;
node->left = pre;
}
pre = node;
if (!head)
head = node;
last = node;
inorder(node->right, head, pre, last);
}
};
迭代
迭代的方法是通过一个栈来实现的,先把最左下角的节点放入栈中,然后依次出栈,出栈的时候处理该栈,并且把这个节点的右节点放入栈中。
C++代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root) return nullptr;
Node* head = nullptr;
Node* pre = nullptr;
Node* last = nullptr;
stack<Node*> st;
Node* p = root;
while (!st.empty() || p) {
if (p) {
st.push(p);
p = p->left;
} else {
Node* node = st.top(); st.pop();
if (!node) continue;
p = node->right;
if (!head)
head = node;
if (pre) {
pre->right = node;
node->left = pre;
}
pre = node;
last = node;
}
}
last->right = head;
head->left = last;
return head;
}
};
相似题目:94. Binary Tree Inorder Traversal
参考资料:https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/solution/liang-chong-jie-fa-by-jason-2-11/
日期
2019 年 9 月 21 日 —— 莫生气,我若气病谁如意
【LeetCode】426. Convert Binary Search Tree to Sorted Doubly Linked List 解题报告 (C++)的更多相关文章
- LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
原题链接在这里:https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/ 题目: C ...
- [leetcode]426. Convert Binary Search Tree to Sorted Doubly Linked List二叉搜索树转有序双向链表
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...
- 426. Convert Binary Search Tree to Sorted Doubly Linked List把bst变成双向链表
[抄题]: Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right po ...
- [LC] 426. Convert Binary Search Tree to Sorted Doubly Linked List
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...
- [LeetCode] Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表
Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers ...
- LeetCode426.Convert Binary Search Tree to Sorted Doubly Linked List
题目 Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right point ...
- [LeetCode] 272. Closest Binary Search Tree Value II 最近的二叉搜索树的值 II
Given a non-empty binary search tree and a target value, find k values in the BST that are closest t ...
- 【LeetCode】430. Flatten a Multilevel Doubly Linked List 解题报告(Python)
[LeetCode]430. Flatten a Multilevel Doubly Linked List 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: ...
- [LeetCode#272] Closest Binary Search Tree Value II
Problem: Given a non-empty binary search tree and a target value, find k values in the BST that are ...
随机推荐
- python检验代理ip是否可用、代理ip检验
python检验代理ip是否可用.代理ip检验 安装相关模块: pip install requests 验证代理IP是否可用脚本: import random import telnetlib im ...
- 【ThermoRawFileParser】质谱raw格式转换mgf
众所周知,Proteowizard MSconvert用于质谱原始数据的格式转换,但主要平台是windows,要想在Linux上运行需要打Docker或Wine,对于普通用户来说还是很困难的,想想质谱 ...
- Docker实用命令介绍
Docker实用命令介绍 1. docker启动.关闭.停止 ╭─wil-xz in ~ 12:15:44 ╰─٩(ŏ﹏ŏ.)۶ service docker restart Redirecting ...
- Oracle——创建多个实例(数据库)、切换实例、登录数据库实例
oracle中怎么创建多个实例? 其实很简单,怎么创建第一个实例,其他实例应该也怎么创建. 我的理解其实在linux中的oracle数据库中创建一个实例,实际上就是创建一个新的数据库,只是实例名字不同 ...
- 关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. ...
- CentOS7忘记root密码如何重置
1.重启服务器 2.修改启动文件 3.修改密码 4.重启,测试 ① 重启服务器,按"e"键进入修改系统开机项界面 ② 修改启动文件 "ro" -> ...
- euerka总结
一.euerka的基本知识 1. 服务治理 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系 ...
- JavaSE中级篇1 — 核心思想:面向对象 — 更新完毕
1.面向对象编程思想(重点中的重点) 题外话: 其他都还可以是技术,但这里是走自己的路--面向对象编程,即:OOP,养成的思想就是:万物皆对象,懂得把东西抽离出来 这一部分记的理论知识很多,而且需要自 ...
- MyBatis中sql实现时间查询的方法
<if test="startTime != null and startTime !=''"> AND lTime >= #{startTime} </i ...
- springboot+vue集成mavon-editor,开发在线文档知识库
先睹为快,来看下效果: 技术选型 SpringBoot.Spring Security.Oauth2.Vue-element-admin 集成mavon-editor编辑器 安装 mavon-edit ...