思路分析
这道题使用比较花里胡哨一点的递归。我们确定这样一个递归框架:遍历到某个结点时,只做这样一件事:把它左侧的结点连接到它身上去。因此要新增一个名为pre的函数参数,存储着该结点的左侧结点。
现在思考怎么遍历。
向右侧的遍历简单,pre就是root->left。
向左侧的遍历也简单,如果pre存在,那么就是pre的右结点,否则就是空结点。
AC代码
class Solution{
public:
void go(Node* root,Node* pre){
if(!root) return;
if(pre) pre->next = root;
go(root->left, pre ? pre->right : nullptr);
go(root->right, root->left);
}
Node* connect(Node* root){
go(root, nullptr);
return root;
}
};
总结
相信直觉。要建立好递归的框架思维。
写树的题目是锻炼递归思维的绝佳手段。