LeetCode 树 116. 填充每个节点的下一个右侧节点指针(层序遍历 分层)

Posted take-it-easy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 树 116. 填充每个节点的下一个右侧节点指针(层序遍历 分层)相关的知识,希望对你有一定的参考价值。

技术图片

 

 技术图片

 

 题目的要求,大白话说就是:把指针指向同层的右侧节点

提到同层,自然就要想到层序遍历,自然是队列实现

 

 

问题是需要分层

所以采用之前题目用的那种计数的方式

class Solution {
    public Node connect(Node root) {
        if(root==null)
        {return root;}
        
        Queue<Node> queue=new ArrayDeque<>();
        Node fake=root;
        queue.add(root);
        while(queue.size()!=0)
        {
            int count=queue.size();
            for(int n=0;n<count;n++)
            {
                fake=queue.poll();
                if(n<count-1)
                {
                    fake.next=queue.peek();
                }
                if(fake.left!=null)
                {
                    queue.add(fake.left);
                }
                if(fake.right!=null)
                {
                    queue.add(fake.right);
                }
            }
        }
        return root;
    }
}

几个碰到的问题:

1.前面要加对于空树的判断,要不会搞出null.next这种错误

2.循环跳出的条件是什么?是queue.size()!=0,即所有元素已经进了队列并且弹出了。我一开始写成了fake!=null这个条件。仔细走一下这个顺序,发现fake会一直都是最后一个节点,跑成了死循环。但其实加个判断也能解决,但其实判断的条件就是队列排空。

3.这个地方

if(n<count-1)
                {
                    fake.next=queue.peek();
                }

首先是,好在有一个peek的方法,使我们不用搞front Node和back Node来把先后排出队列的节点连起来

其次是为什么要加if(n<count-1)这个计数的条件。因为最后一个元素的peek会peek到下一层去。。。

 

由此发现,这种循环中,判断循环条件是什么任然是一个很棘手的问题。

 

以上是关于LeetCode 树 116. 填充每个节点的下一个右侧节点指针(层序遍历 分层)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 二叉树专项填充每个节点的下一个右侧节点指针(116)

[LeetCode] 116. 填充每个节点的下一个右侧节点指针

LeetCode第116题—填充每个节点的下一个右侧节点指针—Python实现

Leetcode 116. 填充每个节点的下一个右侧节点指针

Leetcode No.116 填充每个节点的下一个右侧节点指针

Leetcode No.116 填充每个节点的下一个右侧节点指针(BFS)