zoukankan      html  css  js  c++  java
  • 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 912. 排序数组
    leetcode 633. 平方数之和
    leetcode 1512. 好数对的数目
    leetcode 1822. 数组元素积的符号
    leetcode 145. 二叉树的后序遍历
    leetcode 11. 盛最多水的容器
    leetcode 28 实现strStr()
    leetcode 27. 移除元素
    leetcode 26. 删除有序数组中的重复项
    产品化思维之公式系统
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/13294628.html
Copyright © 2011-2022 走看看