解题思路:
使用一个辅助节点 prev 记录当前节点 cur 的上一个节点。(prev全局只需要有一个)
1.cur的左指针作为前驱指针,指向前一个节点prev。
2.cur不知道它的下一个节点是谁,但是prev知道它的下一个节点是cur。
代码实现:
class Solution {
public:
void Inorder(Node* cur , Node*& prev)
{
if(cur == nullptr)
return ;
Inorder(cur->left , prev);
//当前节点的左指针指向前一个节点
cur->left = prev;
if(prev != nullptr) //前一个节点(prev)的右指针指向cur
prev->right = cur;
prev = cur;
Inorder(cur->right , prev);
}
Node* treeToDoublyList(Node* root)
{
if(root == nullptr)
return nullptr;
Node* prev = nullptr;
Inorder(root , prev);
Node* head = root; //找头结点
while(head->left)
head = head->left;
Node* tail = root; //找尾节点
while(tail->right)
tail = tail->right;
head->left = tail; //链接
tail->right = head;
return head;
}
};