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

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

题目描述

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

思路分析

  1. 定义完美二叉树,即此树多了一个next指针,要求当前节点的next指针指向同一层的右侧节点,如果右侧节点为空,则置为空
  2. 使用广度优先的思路,定义一个辅助队列,用于保存每一层的节点信息
  3. 然后遍历每一层的节点,将每一层连接起来,并判断当前节点是否还有子节点,如果有,则将子节点入队列
  4. 重复上述步骤,直到整棵树被全部遍历
  5. 源码见下

源码及分析

/**
     * 使用深度优先,逐层遍历每一层的节点,然后使用next指针相连
     * @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-20 21:23  mx_info  阅读(31)  评论(0)    收藏  举报