题目
分析
首先为空节点,直接返回根节点,然后想办法填充next指针,首先想到的便是层序遍历,利用数据结构中的队列,一层一层遍历。那样的话,空间复杂度为O(n),n为节点个数,不过它是完美二叉树,可以直接想办法填充,具体看代码。
代码
/*
// Definition for a Node.
class Node {
public:
int val;
Node* left;
Node* right;
Node* next;
Node() : val(0), left(NULL), right(NULL), next(NULL) {}
Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}
Node(int _val, Node* _left, Node* _right, Node* _next)
: val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution
{
public:
Node* connect(Node* root)
{
if (root == nullptr)
{
return root;
}
// 从根节点开始
Node* leftst = root;
while (leftst->left != nullptr)
{
// 遍历这一层节点组织成的链表,为下一层的节点更新 next 指针
Node* head = leftst;
while (head != nullptr)
{
// CONNECTION 1
head->left->next = head->right;
// CONNECTION 2
if (head->next != nullptr)
{
head->right->next = head->next->left;
}
// 指针向右移动
head = head->next;
}
// 去下一层的最左的节点
leftst = leftst->left;
}
return root;
}
};
测试
挺可以的。
总结
根据节点的父节点找到不同父节点向右的节点,若不是完美二叉树,应该去思考除了层序遍历的方法还有没有方法填充next指针。