题目地址:
https://leetcode.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list/
给定一个二叉搜索树,要求将其按照中序遍历转为一个双向循环链表,返回值最小的那个链表节点。节点的右指针视为链表节点的next,左指针视为链表节点的prev。
思路是用栈模拟中序遍历。遍历的同时构造双向循环链表即可。最后注意要将最小值和最大值也连接起来。代码如下:
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root) return nullptr;
auto dummy = new Node(0), cur = dummy;
stack<Node*> stk;
auto node = root;
while (node || stk.size()) {
// 将node的左链入栈
while (node) {
stk.push(node);
node = node->left;
}
node = stk.top(); stk.pop();
cur->right = node;
node->left = cur;
cur = cur->right;
// 向右走一步
node = node->right;
}
// 连一下头尾
cur->right = dummy->right;
dummy->right->left = cur;
return dummy->right;
}
};
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h)。
也可以直接递归中序遍历。代码如下:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node() {}
Node(int _val) {
val = _val;
left = NULL;
right = NULL;
}
Node(int _val, Node* _left, Node* _right) {
val = _val;
left = _left;
right = _right;
}
};
*/
class Solution {
public:
Node* treeToDoublyList(Node* root) {
if (!root) return nullptr;
auto dummy = new Node(0), cur = dummy;
dfs(root, cur);
cur->right = dummy->right;
cur->right->left = cur;
return dummy->right;
}
void dfs(Node* p, Node*& cur) {
if (!p) return;
dfs(p->left, cur);
cur->right = p;
p->left = cur;
cur = cur->right;
dfs(p->right, cur);
}
};
时空复杂度一样。