题目描述
思路分析
dfs保存遍历结果,重新新建链表进行连接,不推荐。
但是可以根据二叉树的特点,left和right直接dfs改变指向。
代码展示
/*
// 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 {
Node* prev = nullptr;
Node* head = nullptr;
public:
Node* treeToDoublyList(Node* root) {
if (!root) {
return root;
}
InOrder(root);
head->left = prev;
prev->right = head;
return head;
}
void InOrder(Node* cur) {
if (cur == nullptr) {
return;
}
InOrder(cur->left);
//改变指向
if (prev == nullptr) {
prev = cur;
head = cur;//只进入一次
}else {
prev->right = cur;
cur->left = prev;
prev = cur;
}
InOrder(cur->right);
}
};
运行结果
时间复杂度O(N)
空间复杂度O(N)