小伙子个人理解,递归解决问题要注意两个点:起始点和终止点
就题目的描述:起始点是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;
}
};

京公网安备 11010502036488号