作者:logilong
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/solution/offer36er-cha-sou-suo-shu-yu-shuang-xian-1ant/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
用笔写一些画一画,感受一下
/*
/*
// 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* pre = NULL;
Node* head = NULL;
Node* treeToDoublyList(Node* root) {
if(!root) return NULL;
dfs(root);
// 双向链表的第一个和最后一个结点的指向没有确定
// 执行dfs后,pre指向最后一个结点
head->left = pre;
pre->right = head;
return head;
}
void dfs(Node* cur){
if(cur==NULL) return;
// 左-中(visit)-右 双向链表的结点顺序就是中序遍历顺序
dfs(cur->left);
// visit
// 如果双向链表的前一个结点为空,设置当前结点为链表头结点(实际上就是找到中序遍历的开头)
// 不为空,则指向当前结点
if(pre!=NULL)
pre->right = cur;
else
head = cur;
// cur的left指针指向pre,更新结点
cur->left = pre;
pre = cur;
// 左-中-右 的右
dfs(cur->right);
}
};