思路
算法流程:
Node* treeToDoublyList(Node* root)
1.特例处理:若结点root为空,直接返回
2.转化为排序双向链表:调用inorder(Node* root)
3.构建循环链表:head和pre双向结点引用
4.返回头结点
void inorder(Node* root)
中序遍历的改写,在访问根节点时,同时更新pre,head的值,使其能够双向连接
代码
class Solution {
public:
Node* pre=nullptr, *head;//需要初始化pre=nullptr,head为链表头结点,pre为链表前驱结点
Node* treeToDoublyList(Node* root) {
if (root == nullptr) return nullptr;//特例处理
inorder(root);//中序遍历
//遍历完成后,head指向头结点,pre指向尾结点,因此要修改head和pre的双向结点引用,使其首尾相连
head->left = pre;
pre->right = head;
return head;
}
//中序遍历
void inorder(Node* root) {
if (root == nullptr) return;//递归边界
inorder(root->left);
if (pre == nullptr) head = root;//pre为空,说明此结点为链表头结点
else {
pre->right = root;//前驱结点的后继即为root
root->left = pre;//当前结点的前驱即为pre
}
pre = root;//pre更新,结点root是后继结点的pre
inorder(root->right);
}
};