中序遍历
用只记录前一个和第一个节点记录
class Solution {
public:
Node* pre;Node* head;
void dfs(Node* root){
if(!root)return;
dfs(root->left);
if(pre){
pre->right=root;
root->left=pre;
}else head=root;
pre=root;
dfs(root->right);
}
Node* treeToDoublyList(Node* root) {
dfs(root);
if(!root)return root;
pre->right=head;
head->left=pre;
return head;
}
};
中序遍历
用vector记录
class Solution {
public:
vector<Node*>temp;
void dfs(Node* root){
if(!root)return;
dfs(root->left);
temp.push_back(root);
dfs(root->right);
}
Node* treeToDoublyList(Node* root) {
dfs(root);
if(!root)return root;
int n=temp.size();
// for(Node* ab:temp)cout<<ab->val<<endl;
for(int i=1;i<n;i++){
temp[i-1]->right=temp[i];
temp[i]->left=temp[i-1];
}
temp[n-1]->right=temp[0];
temp[0]->left=temp[n-1];
return temp[0];
}
};