观察容易发现双向链表的顺序与该二叉树中序遍历的结果相同。故首先考虑中序遍历解题。
最开始由于题目中要求空间复杂度为O(1),故考虑原地操作,但递归的中序遍历也需要用到递归栈,如果真的要满足空间复杂度为O(1),则需要考虑迭代中序遍历树,或放弃中序遍历的思路。
这里最终还是选择使用中序遍历,将结点按中序遍历的顺序插入数组,然后遍历数组依此修改左右指针。
这里需要注意中序遍历的顺序十分重要,必须是先左子树后右子树,否则就算在遍历数组中反转左右指针,一样会出错。

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<TreeNode*> arr;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(!pRootOfTree){
            return pRootOfTree;
        }
        change(pRootOfTree);
        arr.front()->left = nullptr;
        arr.back()->right = nullptr;
        for (int i = 0; i < arr.size()-1; ++i){
            arr[i]->right = arr[i+1];
            arr[i+1]->left = arr[i];
        }
        return arr.front();
    }
    void change(TreeNode* &p){
        if(p->left){
            change(p->left);
        }
        if(p){
            arr.push_back(p);
        }
        if(p->right){
            change(p->right);
        }
    }
};