/*
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* prev = nullptr;
InOrderList(pRootOfTree,prev);//用中序遍历去完成链接操作
//找到头结点并返回
TreeNode* head = pRootOfTree;
while(head && head->left)
head = head->left;
return head;
}
void InOrderList(TreeNode* cur,TreeNode*& prev)//这里的prev要传引用,这样可以保证他们共用的是一个prev
{
if(cur == nullptr)//如果是空就跳出
return;
InOrderList(cur->left,prev);//先去遍历左子树
cur->left = prev;//当前左节点给上一个节点
if(prev)
prev->right = cur;//上一个的右节点指向当前节点
prev = cur;//现在当前节点成了上一个,再去右子树递归
InOrderList(cur->right,prev);
}//思路:因为找不到下一个节点,所以只能让当前节点和上一个节点创建双向关系,那当前节点和下一个节点的关系就要靠下一次递归来完成
};