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

 


目录

 一、题目

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<Node> 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()取不删

猜你喜欢

转载自blog.csdn.net/qq_43846797/article/details/124627859