/* 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); }//思路:因为找不到下一个节点,所以只能让当前节点和上一个节点创建双向关系,那当前节点和下一个节点的关系就要靠下一次递归来完成 };