这道题还是挺难的
要理解目标双向链表的意思,同时要学会用递归遍历。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* root)
{
if(!root) return NULL;
auto sides = dfs(root);
return sides.first;
}
pair<TreeNode*, TreeNode*> dfs(TreeNode* root){
if(!root->left && !root->right) return {root, root};
if(root->left && root->right){
auto lsides = dfs(root->left), rsides = dfs(root->right);
root->left = lsides.second, lsides.second->right = root;
root->right = rsides.first, rsides.first->left = root;
return {lsides.first, rsides.second};
}
if(root->left){
auto lsides = dfs(root->left);
root->left = lsides.second, lsides.second->right = root;
return {lsides.first, root};
}
if(root->right){
auto rsides = dfs(root->right);
root->right = rsides.first, rsides.first->left = root;
return {root, rsides.second};
}
}
};