zoukankan      html  css  js  c++  java
  • 二叉树-广度优先-队列

    https://www.nowcoder.com/practice/fdbd05d647084fcf9be78444e231998b?tpId=46&tqId=29064&tPage=1&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

    给定一个二叉树

    class TreeLinkNode {
        int val;
        TreeLinkNode left, right, next;
        TreeLinkNode(int x) { val = x; }
    }
    
    填充所有节点的next指针,指向它右兄弟节点。如果没有右兄弟节点,则应该将next指针设置为NULL。
    初始时,所有的next指针都为NULL
    注意:
    • 你只能使用常量级的额外内存空间
    • 可以假设给出的二叉树是一个完美的二叉树(即,所有叶子节点都位于同一层,而且每个父节点都有两个孩子节点)。
    例如:给出如下的完美二叉树
     1↵       /  ↵      2    3↵     /   / ↵    4  5  6  7↵
    

    调用完你给出的函数以后,这颗二叉树应该 变成:

             1 -> NULL↵       /  ↵      2 -> 3 -> NULL↵     /   / ↵    4->5->6->7 -> NULL
    


     队列(Queue)用法

    https://www.runoob.com/java/data-queue.htmlhttps://www.cnblogs.com/lemon-flm/p/7877898.html

    队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。

    LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。

    add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常
    remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
    element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
    offer       添加一个元素并返回true       如果队列已满,则返回false
    poll         移除并返问队列头部的元素    如果队列为空,则返回null
    peek       返回队列头部的元素             如果队列为空,则返回null
    put         添加一个元素                      如果队列满,则阻塞
    take        移除并返回队列头部的元素     如果队列为空,则阻塞

    remove、element、offer 、poll、peek 其实是属于Queue接口。 


    链接:https://www.nowcoder.com/questionTerminal/fdbd05d647084fcf9be78444e231998b?f=discussion
    来源:牛客网
    
    辅助队列
    import java.util.Queue;
    import java.util.LinkedList;
    public class Solution {
        public void connect(TreeLinkNode root) {
            if(root==null)
                return;
            Queue<TreeLinkNode> q=new LinkedList<TreeLinkNode>();
            q.add(root);
            q.add(null);
            while(!q.isEmpty()){
                TreeLinkNode node=q.remove();
                if(!q.isEmpty()){
                   node.next=q.peek();
                   if(node.left!=null)
                       q.add(node.left);
                   if(node.right!=null)
                       q.add(node.right);
                   if(q.peek()==null){
                       q.add(null);
                       q.remove();
                   }
               }              
            }
        }
    }  

      我的理解:

    1.把TreeLinkNode加入队列,把null加入队列

    2.remove移除第一个,返回移除的信息AA用于接下来的操作。

    3.若队列不为空,则AA的next为当前队列的第一个。

    4.若左孩子不为空,则加入队列。

    5.若右孩子不为空,则加入队列。

    6.若队列第一个元素为null,则删除,并在队列后再加一个null;

    。。。

    这样就全部处理完了。

    链接:https://www.nowcoder.com/questionTerminal/fdbd05d647084fcf9be78444e231998b?f=discussion
    来源:牛客网
    
    public class Solution {
        public void connect(TreeLinkNode root) {
            if(root==null)return;
            while(root.left!=null){
                TreeLinkNode node=root;
                while(node!=null){
                    node.left.next=node.right;
                    if(node.next!=null)node.right.next=node.next.left;
                    node=node.next;
                }
                root=root.left;
            }
        }
    }
    

      这个是两个while循环来处理的。

  • 相关阅读:
    float保留指定位数的小数
    springmvc中拦截器的使用
    springmvc文件上传
    spring注入
    mybatis动态代理
    2017《JAVA技术》预备作业02 计科1502 郎春雨
    2017《JAVA技术》预备作业01 计科1502 郎春雨
    字符串占位符的使用
    Pyenv虚拟环境的创建(虚拟机)
    Git的基本使用
  • 原文地址:https://www.cnblogs.com/jiangym/p/13022591.html
Copyright © 2011-2022 走看看