/*
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) 
	{
		TreeNode *cur = pRootOfTree,*prev = nullptr;
		InOrderList(cur, prev);//因为二叉搜索树的中序遍历就是有序,所以用中序遍历递归的顺序去链接
		//链接完后,找到该链表的头,并返回
		while(cur && cur->left)
		{
			cur = cur->left;
		}	
		return cur;
	}
	void InOrderList(TreeNode* cur,TreeNode*& prev)//prev必须传引用,这样才能保证当前栈帧中改变的prev能应用到其他栈帧中
	{
		if(cur == nullptr)//如果是空,就跳出
			return;

		InOrderList(cur->left,prev);//先遍历左子树
		//此时左子树的根节点就通过34行赋给prev了,如果prev不是引用,下面的操作就不对了
		cur->left = prev;//将当前节点的左指向上一个节点
		if(prev)
			prev->right = cur;//将上一个节点的右指向当前节点
		//此时就将当前节点和上一个节点的链接完成了,因为找不到下一个节点,所以当前节点和下一个节点的链接只能在下次递归时完成
		prev = cur;//将当前节点变成上一个节点,这样在下面递归时才能将上当前节点和下一个节点链接
		InOrderList(cur->right,prev);
	}
};