返回轨道
算法 · 2026-05-14 · 26 阅读

P181 树节点的 next 指针

算法 26 阅读

信号摘要

难度:Medium · 时长:07:54 · leetcode 116

P181 树节点的 next 指针

未对外公开播放权限
点击查看说明

描述

这个题目说的是,给你一棵满二叉树,每个树节点额外增加一个 next 指针,指向它右边的节点。一开始所有节点的 next 指针都为空,你要写一个函数处理这棵二叉树,使得所有节点的 next 指针都指向正确的节点。

注意,满二叉树中,所有叶子节点都在最后一层。并且除了叶子节点,所有其他节点都有两个子节点。

// 包含 next 指针的树节点定义
public class Node {
  public int val;
  public Node left, right, next;
}

比如说,给你的满二叉树是:

 0

/
2 4 / \ /
6 8 10 12

一开始每个节点的 next 指针都为空。你要做的就是,让每个节点的 next 指针指向它右边的节点。对于每一层中最后一个节点,由于它右边没有节点,因此它的 next 指针仍然指向空即可。

  0 -> null

/
2 -> 4 -> null / \ /
6-> 8->10-> 12 -> null

代码

public class AlgoCasts {

  class Node {
    public int val;
    public Node left, right, next;

    public Node(int val) {
      this.val = val;
    }

    public Node(int val, Node left, Node right) {
      this.val = val;
      this.left = left;
      this.right = right;
    }
  }

  // Time: O(n), Space: O(log(n))
  public Node connectRecursive(Node root) {
    if (root == null || root.left == null) return root;
    root.left.next = root.right;
    if (root.next != null)
      root.right.next = root.next.left;
    connectRecursive(root.left);
    connectRecursive(root.right);
    return root;
  }

  // Time: O(n), Space: O(1)
  public Node connectIterative(Node root) {
    if (root == null) return null;
    Node leftMost = root, p;
    while (leftMost.left != null) {
      p = leftMost;
      while (p != null) {
        p.left.next = p.right;
        if (p.next != null)
          p.right.next = p.next.left;
        p = p.next;
      }
      leftMost = leftMost.left;
    }
    return root;
  }

}

📡 通讯频道