初始状态下,所有 next 指针都被设置为 NULL。
层次遍历队列实现(非完全二叉树也可以用这种方法)
class Solution {
public Node connect(Node root) {
if (root == null) {
return root;
}
// 初始化队列同时将第一层节点加入队列中,即根节点
Queue<Node> queue = new LinkedList<Node>();
queue.add(root);
// 外层的 while 循环迭代的是层数
while (!queue.isEmpty()) {
// 记录当前队列大小
int size = queue.size();
// 遍历这一层的所有节点
for (int i = 0; i < size; i++) {
// 从队首取出元素
Node node = queue.poll();
// 连接
if (i < size - 1) {
node.next = queue.peek();
}
// 拓展下一层节点
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
}
}
// 返回根节点
return root;
}
}
将每一层的点都连接起来。每个结点的next指针都指向右边的结点,这样分两种情况:
对root的下一层进行连接(通过root的next指针)
如果右边结点是亲兄弟结点,则在遍历到父节点的时候就root->left->next = root->right;;
如果右边结点是堂兄弟结点,则在遍历到父节点的时候(此时父节点的next指针已经指向了右边的兄弟节点),通过父节点的next指针与右边结点相接: root->right->next = root->next->left;
class Solution {
public:
Node* connect(Node* root) {
if(root==NULL){
return NULL;
}
if(root->left!=NULL){//左子树
root->left->next=root->right;
}
if(root->right!=NULL&&root->next!=NULL){//右子树(用root的next来定位
//右子树的next)
root->right->next=root->next->left;
}
root->left=connect(root->left);
root->right=connect(root->right);
return root;
}
};