小伙子个人理解,递归解决问题要注意两个点:起始点和终止点
就题目的描述:起始点是10,终止点是任一叶子结点(比如4)
在处理起始点10时,可以认为10左边的点4,6,8和右边的结点12,14,16已经被分别处理成了双向链表
并且题目要求返回双向链表的头结点,所以10的左边返回的是结点4,右边返回的是结点12
所以10在连接左边时,需要先找到左边双向链表中最右边的值,然后进行连接
10连接右边时,直接连接右边返回的结点即可
连接后,要返回最左边的结点
在处理终止点(这里举例结点4)时,则分别看它左右结点是否为空(这里使用的方法是直接调用convert函数,而不是通过左右指针),如果为空则什么都不做
/* 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* answer = nullptr; TreeNode* temp = nullptr; if(pRootOfTree == nullptr){ return nullptr; } temp = Convert(pRootOfTree->left); if(temp == nullptr){ ; }else{ while (temp->right!=nullptr) { temp = temp->right; } temp->right = pRootOfTree; pRootOfTree->left = temp; } temp = Convert(pRootOfTree->right); if(temp == nullptr){ ; }else{ pRootOfTree->right = temp; temp->left = pRootOfTree; } temp = pRootOfTree; while(temp->left!=nullptr){ temp = temp->left; } answer = temp; return answer; } };