📌  相关文章
📜  连接同一级别的节点(级别顺序遍历)(1)

📅  最后修改于: 2023-12-03 15:41:56.035000             🧑  作者: Mango

连接同一级别的节点(按级别顺序遍历)

在二叉树中,我们有时需要对同一级别的节点进行连接,以方便后续操作。常见的应用场景包括层级遍历、寻找二叉树每一层的最右侧节点等。

在本文中,我们将分享几种常见方法,以连接同一级别的节点。此外,我们还将介绍如何按层级顺序遍历二叉树。

遍历并连接同一级别的节点
方法一:使用BFS算法

BFS算法可以遍历二叉树,并保存每一层的节点。因此,我们可以利用这种方法来连接同一级别的节点。具体步骤如下:

  1. 从根节点开始,将其放入队列中;
  2. 在队列不为空的情况下,遍历队列中的元素(即当前层级的所有节点),并将它们的左右节点放入队列中;
  3. 在遍历完当前层级的所有节点后,连接它们,并将它们的子节点作为下一层级的待连接节点;
  4. 重复上述步骤,直到遍历完所有节点。

下面是使用BFS算法连接二叉树同一级别节点的Java代码示例(假设二叉树中的节点结构为TreeNode):

public void connect(TreeNode root) {
    if (root == null) {
        return;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        int levelSize = queue.size();
        TreeNode pre = null;
        for (int i = 0; i < levelSize; i++) {
            TreeNode cur = queue.poll();
            if (pre != null) {
                pre.next = cur;
            }
            pre = cur;
            if (cur.left != null) {
                queue.offer(cur.left);
            }
            if (cur.right != null) {
                queue.offer(cur.right);
            }
        }
    }
}
方法二:使用递归方法

使用递归方法连接二叉树同一级别的节点也是一种常见的做法。具体步骤如下:

  1. 定义一个辅助函数,在该函数中,连接两个同一级别的节点(prev和cur)并将其返回;
  2. 在递归过程中,通过将根节点的左右儿子传入辅助函数,返回当前层级的连接结果;
  3. 当递归到叶子节点时,直接返回该节点作为该层级的连接结果。

下面是使用递归方法连接二叉树同一级别节点的Java代码示例:

public void connect(TreeNode root) {
    if (root == null) {
        return;
    }
    connectTwoNode(root.left, root.right);
}

public void connectTwoNode(TreeNode node1, TreeNode node2) {
    if (node1 == null || node2 == null) {
        return;
    }
    node1.next = node2;

    connectTwoNode(node1.left, node1.right);
    connectTwoNode(node2.left, node2.right);
    connectTwoNode(node1.right, node2.left);
}
按层级顺序遍历二叉树

在连接同一级别的节点之前,我们常常需要按照树的层级顺序遍历二叉树。这可以通过BFS算法轻松实现。具体步骤如下:

  1. 从根节点开始,将其放入队列中;
  2. 在队列不为空的情况下,遍历队列中的元素(即当前层级的所有节点),并将它们的左右节点放入队列中;
  3. 在遍历完当前层级的所有节点后,将下一层级的待访问节点作为新的队列,并将该层级的节点值放入结果集中;
  4. 重复上述步骤,直到遍历完所有节点。

下面是按层级顺序遍历二叉树的Java代码示例:

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    if (root == null) {
        return res;
    }
    Queue<TreeNode> queue = new LinkedList<>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        int levelSize = queue.size();
        List<Integer> curLevel = new ArrayList<>();
        for (int i = 0; i < levelSize; i++) {
            TreeNode curNode = queue.poll();
            curLevel.add(curNode.val);
            if (curNode.left != null) {
                queue.offer(curNode.left);
            }
            if (curNode.right != null) {
                queue.offer(curNode.right);
            }
        }
        res.add(curLevel);
    }
    return res;
}
总结

连接同一级别的节点和按层级顺序遍历二叉树是二叉树问题中的两种基本操作。本文介绍了两种方法:使用BFS算法和使用递归方法。需要根据实际问题具体选择方法,并加以应用才能够发挥出二叉树的威力。