• 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到下一层去。。。

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

  • 相关阅读:
    【整理】Linux 下 自己使用的 debug宏 printf
    STM32学习笔记:创建标准库工程模板
    【闲谈】第一份实习(下)
    Ceres-Solver库入门
    ceres-solver库使用示例
    ceres-solver库编译说明
    October 23, 2013
    Pollution over East China : Image of the Day
    谈谈PCI的GXL
    InfoQ访谈:Webkit和HTML5的现状和趋势
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13294628.html
Copyright © 2020-2023  润新知