你今天学算法了吗?打卡第二十天
目录
一、题目
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()取不删