> 文档中心 > 你今天学算法了吗?打卡第二十天

你今天学算法了吗?打卡第二十天

 


目录

 一、题目

1、题目描述

2、基础框架

3、原题链接

二、解题报告

1、思路分析

2、代码详解

三、本题小知识


 一、题目

1、题目描述

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

  

struct Node {  int val;  Node *left;  Node *right;  Node *next;}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

 

示例 1:

输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化的输出按层序遍历排列,同一层节点由 next 指针连接,'#' 标志着每一层的结束。

示例 2:

输入:root = []输出:[]

2、基础框架

   Java 版本给出的基础框架代码如下:   

/*// 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) {}

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

 

3、原题链接

    LeetCode 116. 填充每个节点的下一个右侧节点指针

二、解题报告

1、思路分析

层次遍历二叉树

依次将每一层加入对列中

并通过去对顶,删对顶来辅助建立连接

具体操作看代码详解注释

2、代码详解

/*// 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 root; } //初始化队列并将根节点放入 Queue queue = new LinkedList(); queue.add(root);  //当队列不空作为出口 //队列为空时即表示二叉树最后一层遍历完了 while(!queue.isEmpty()){     //记录当前队列的长度     int n=queue.size();     //遍历该层     for(int i=0;i<n;i++){  //取出队首结点,并删除队列中的首结点  //删除是为了建立连接时,next指向结点即为当前的队首  Node node = queue.poll();  //建立联系  if(i<n-1){      node.next=queue.peek();  }  //将第二层加入队列  if(node.left!=null){      queue.add(node.left);  }  if(node.right!=null){      queue.add(node.right);  }     } } return root;    }}

三、本题小知识

  链表、二叉树的层次遍历、队列pool()方法取顶并删除,peek()取不删