思路:
- 找到头节点和尾节点
- 中序遍历记录前驱和后继节点
- 头尾互指
- 返回头
/*
// 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* p1{},*p2{},*tail{},*head{};//p1后继节点、p2前驱节点
Node* treeToDoublyList(Node* root) {
if(!root) return NULL;
Node* r=root;
while(r->right)
r=r->right;
tail=r;//得到尾节点
r=root;
while(r->left)
r=r->left;
head=r;//得到头节点
inorder(root);//中序遍历,改变树为双向链表
head->left=tail;
tail->right=head;//头节点、尾节点互指
return head;//返回头节点
}
void inorder(Node* root){
if(!root) return;
build(root->left);//遍历左子树
Node* p=root->right;//保存右子树
if(!p1&&!p2){
p1=root;
}else {
p2=p1;
p1=root;
p1->left=p2;
p2->right=p1;
}
build(p);//遍历右子树
}
};