中序遍历+递归,建立两个节点:pre和head。
判断是否是第一个头节点,也就是pre=nullptr,用head记录第一个节点。
然后常规操作:pre->right=cur; cur->left=pre;更新pre=cur;
最后head->left=pre,pre->right=head;此时的pre是最后一个节点。
/*
// 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:
void dfs(Node*cur)
{
if(cur==nullptr) return;
dfs(cur->left);
if(pre==nullptr){
head=cur;
cur->left=nullptr;
}
else{
cur->left=pre;
pre->right=cur;
}
pre=cur;
dfs(cur->right);
}
Node* treeToDoublyList(Node* root) {
if(root==nullptr) return root;
dfs(root);
head->left=pre;
pre->right=head;
return head;
}
private:
Node*head,*pre=nullptr;
};