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

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

题目描述

 /**
     * 给定一个二叉树
     *
     * 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。
     * 如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
     *
     * 初始状态下,所有 next 指针都被设置为 NULL。
     *
     */

思路分析

  1. 填充每个节点的下一个节点,即二叉树的每个节点多了一个next指针,将每一层节点的next指针指向当前层的右侧节点,最右侧节点置为空
  2. 使用广度优先的思想,逐层遍历每一层节点,使用一个辅助队列保存每一层的节点
  3. 使用双层循环,外层循环控制对整棵树的遍历,内层循环控制对每一层节点的遍历
  4. 判断当前层节点是否是最右边的一个,如果不是,则将其next指针指向当前层右侧节点,如果是,则将其置空
  5. 然后再判断当前层的下一层是否还有节点,如果有,则入队列,继续相同的操作,直到整棵树都被遍历完
  6. 详解见下

源码及分析

/**
     * @param root 二叉树根节点
     * @return
     */
    public Node connect(Node root) {
        //数据校验
        if (root == null) {
            return root;
        }
        //创建队列用于保存每一层的节点
        Queue<Node> queue = new LinkedList<>();
        //先将根节点入队列
        queue.offer(root);
        //外层循环控制遍历所有层的节点
        while (!queue.isEmpty()) {
            //记录当前层的节点个数
            int size = queue.size();
            //遍历当前层节点
            for (int i = 0; i < size; i++) {
                //取出第一个节点
                Node node = queue.poll();
                //如果取出的节点不是当前层最右边的节点,则将其next指针指向其右侧节点
                if (i < size - 1) {
                    node.next = queue.peek();
                }
                //若下一层节点不为空,则将下一层节点入队列,重复上述步骤
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
        }
        return root;
    }
posted @ 2021-09-21 10:48  mx_info  阅读(34)  评论(0)    收藏  举报