zoukankan      html  css  js  c++  java
  • Leetcode 117. 填充每个节点的下一个右侧节点指针 II

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

    数据结构定义:

    给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
    
    struct Node {
      int val;
      Node *left;
      Node *right;
      Node *next;
    }
    填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
    
    初始状态下,所有 next 指针都被设置为 NULL。  
    
    /*
    // Definition for a Node.
    class Node {
        public int val;
        public Node left;
        public Node right;
        public Node next;
    
        public Node() {}
        
        public Node(int _val) {
            val = _val;
        }
    
        public Node(int _val, Node _left, Node _right, Node _next) {
            val = _val;
            left = _left;
            right = _right;
            next = _next;
        }
    };
    */
    

    递归写法:

    /*
    *	思路:层序遍历 + 尾插法
    *   外部while循环为向下遍历,内部while循环为同层级节点遍历并连接
    *   定义一个哑节点dummy,表示当前节点的下一层最左节点
    *   定义 tail 使用尾插法连接同一层所有节点
    */
    class Solution {
        public Node connect(Node root) {
            if(root == null){
                return null;
            }
            Node node = root;
            while(node != null){
              Node dummy = new Node(-1);
              Node tail = dummy;
              while(node != null){
                  if(node.left != null){
                      tail.next = node.left;
                      tail = tail.next;
                  }
                  if(node.right != null){
                      tail.next =node.right;
                      tail = tail.next;
                  }
                  node = node.next;
              }
              node = dummy.next;
            }
            return root;
        }
    }
    

    运用队列进行迭代

    class Solution {
        public Node connect(Node root) {
            if(root == null){
                return null;
            }
            LinkedList<Node> queue = new LinkedList<>();
            queue.offer(root);
            while(!queue.isEmpty()){
                int size = queue.size();
                for(int i = 0;i < size; i++){
                    Node temp = queue.poll();
                    if(i < size -1){
                        temp.next = queue.peek();
                    }
                    if(temp.left != null){
                        queue.offer(temp.left);
                    }
                    if(temp.right != null){
                        queue.offer(temp.right);
                    }
                }
            }
            return root;
        }
    }
    
  • 相关阅读:
    SQL 存储过程入门(五)
    QT程序崩溃原因示例和分析
    全志(allwinner)编译过程问题与解决方法汇总
    rust Linux环境下开发环境安装 和 IDE工具 EMACS配置
    DMZ
    什么是浮动IP
    PLMN和PSTN
    人生 -- 有感于近期的一个事件
    职场四原则
    Fatal error compiling: java.lang.NoSuc hFieldError??
  • 原文地址:https://www.cnblogs.com/CodingXu-jie/p/13985904.html
Copyright © 2011-2022 走看看