/*
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* pRootOfTree) {
        if(pRootOfTree == nullptr) return nullptr;

		return dp(pRootOfTree);
    }

	TreeNode* dp(TreeNode* node){
		if(!node->left && !node->right){
			return node;  //单节点直接返回
		}

		TreeNode* node_1;  //不在if()中声明,可能出现未声明的情况,编译出错不允许
		TreeNode *node_2;
		if(node->left){
			node_1 = dp(node->left);  //左子节点的第一个节点

			TreeNode* curr= node_1;
			while(curr->right){
				curr = curr->right;
			}
			curr->right = node;
			node->left = curr;
		}

		if(node->right){
			node_2 = dp(node->right);  //右子节点的第一个节点

			node->right = node_2;
			node_2->left = node; 
		}

		return node->left? node_1: node;
	}
};