力扣刷题day13|(层序遍历系列题目)116填充每个节点的下一个右侧节点指针、117填充每个节点的下一个右侧节点指针II、104二叉树的最大深度、111二叉树的最小深度

文章目录

    • 116. 填充每个节点的下一个右侧节点指针
      • 思路
    • 117.填充每个节点的下一个右侧节点指针II
      • 思路
    • 104. 二叉树的最大深度
      • 思路
    • 111. 二叉树的最小深度
      • 思路

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

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

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

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

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

思路

在单层遍历的时候,对于每一层的最后一个节点直接让他指向null,对于前面在队里的节点,每pop一个就让他的next指向队头。

第一层需要特殊处理,因为只有一个节点,pop出后队里没有节点

public Node connect(Node root){
    Deque<Node> que = new ArrayDeque<>();

    if (root != null) {
        que.offer(root);
    }

    int size;
    while (!que.isEmpty()) {
        size = que.size();
        for (int i = 0; i < size; i++) {
            Node node = que.poll();
            if (!que.isEmpty()) node.next = que.getFirst();
            if (i == size - 1) {
                node.next = null;
            }
            // 每出队一个节点,就要让他的左右子树入队
            if (node.left != null) {
                que.offer(node.left);
            }
            if (node.right != null) {
                que.offer(node.right);
            }
        }
    }
    return root;
}

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

力扣题目链接

给定一个二叉树

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

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

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

思路

与116题没有区别

public Node connect(Node root){
    Deque<Node> que = new ArrayDeque<>();

    if (root != null) {
        que.offer(root);
    }

    int size;
    while (!que.isEmpty()) {
        size = que.size();
        for (int i = 0; i < size; i++) {
            Node node = que.poll();
            if (!que.isEmpty()) node.next = que.getFirst();
            if (i == size - 1) {
                node.next = null;
            }
            // 每出队一个节点,就要让他的左右子树入队
            if (node.left != null) {
                que.offer(node.left);
            }
            if (node.right != null) {
                que.offer(node.right);
            }
        }
    }
    return root;
}

104. 二叉树的最大深度

力扣题目链接

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7]

  3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

思路

就是层序遍历

public int maxDepth(TreeNode root) {
    Deque<TreeNode> que = new ArrayDeque<>();

    if (root != null) {
        que.offer(root);
    }
    int size; // 记录每层大小
    int depth = 0; // 记录深度
    while (!que.isEmpty()) {
        size = que.size();
        depth++;
        while (size-- > 0) {
            TreeNode node = que.poll();
            // 每出队一个节点,就要让他的左右子树入队
            if (node.left != null) {
                que.offer(node.left);
            }
            if (node.right != null) {
                que.offer(node.right);
            }

        }
    }

    return depth;
}

111. 二叉树的最小深度

力扣题目链接

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

**说明:**叶子节点是指没有子节点的节点。

思路

层序遍历,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点

如果当前节点的左右孩子都为空,直接返回最小深度

if (node.left == null && node.right == null){
    return depth;
}

完整代码

public int minDepth(TreeNode root) {
    Deque<TreeNode> que = new ArrayDeque<>();

    if (root != null) {
        que.offer(root);
    }
    int size; // 记录每层大小
    int depth = 0; // 记录深度
    while (!que.isEmpty()) {
        size = que.size();
        depth++;
        while (size-- > 0) {
            TreeNode node = que.poll();
            
            // 如果当前节点的左右孩子都为空,直接返回最小深度
            if (node.left == null && node.right == null){
                return depth;
            }
            // 每出队一个节点,就要让他的左右子树入队
            if (node.left != null) {
                que.offer(node.left);
            }
            if (node.right != null) {
                que.offer(node.right);
            }

        }
    }

    return depth;
}

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)