ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《中英双解》leetCode Populating Next Right Pointers in Each Node

2021-11-24 18:32:22  阅读:141  来源: 互联网

标签:Node Right 双解 next right root public left


You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.

Initially, all next pointers are set to NULL.

Example 1:


Input: root = [1,2,3,4,5,6,7]
Output: [1,#,2,3,#,4,5,6,7,#]
Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B. The serialized output is in level order as connected by the next pointers, with '#' signifying the end of each level.
Example 2:

 

Input: root = []
Output: []
 

Constraints:

The number of nodes in the tree is in the range [0, 212 - 1].
-1000 <= Node.val <= 1000
 

Follow-up:

You may only use constant extra space.
The recursive approach is fine. You may assume implicit stack space does not count as extra space for this problem.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这第一种方法就是用二叉树的层序遍历 

/*
// 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;
    }
};
*/

class Solution {
   public Node connect(Node root) {
      if(root == null){
         return null;
      }
      Deque<Node> queue = new LinkedList<>();
      queue.add(root);
      while(!queue.isEmpty()){
         int size = queue.size();
         for(int i = 0;i < size;i++){
            Node node = queur.poll();
            if(i < size - 1){
               node.next = queue.peak();
            }
            if(node.left != null){
               queue.add(node.left);
            }
            if(node.right != null){
               queue.add(node.right);
            }
         }
      }
      return root;
   }
}

 下一个方法比较巧妙,注意next节点的使用

/*
// 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;
    }
};
*/

class Solution {
    public Node connect(Node root) {
       if(root == null){
          return null;
       }
       if(root.left != null){
          root.left.next = root.right;
          if(root.next != null){
             root.right.next = root.next.left;
          }
       }
       connect(root.left);
       connect(root.right);
       return root;
    }
}

顺便复习一下二叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
       if(root == null){
          return new ArrayList<>();
       }
       List<List<Integer>> res = new ArrayList<>();
       Queue<TreeNode> queue = new LinkedList<>();
       queue.add(root);
       while(!queue.isEmpty()){
          int size = queue.size();
          List<Integer> list  = new ArrayList<>();
          for(int i = 0;i < size;i++){
             TreeNode node = queue.poll();
             list.add(node.val);
             if(node.left != null) queue.add(node.left);
             if(node.right != null) queue.add(node.right);
          }
          res.add(list);
       }
       return res;
    }
}

标签:Node,Right,双解,next,right,root,public,left
来源: https://blog.csdn.net/weixin_46272350/article/details/121521118

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有