📜  打印完美二叉树的中间层而不求高度(1)

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

打印完美二叉树的中间层而不求高度

在二叉树中,中间层指的是既不是树的根节点也不是叶节点的层级。现在我们的任务是打印完美二叉树的中间层,但是我们不知道二叉树的高度。本文将为您介绍如何在不求高度的情况下打印完美二叉树的中间层,并提供相应的代码实现。

完美二叉树

完美二叉树是指除了叶子节点外,每个节点都有两个子节点且深度相等的二叉树。完美二叉树的高度为$H$,则叶子节点的深度为$H+1$。

解题思路

我们可以使用层序遍历(BFS)的方式遍历二叉树。在遍历的过程中,我们在队列中保留每一层的节点。当遍历到最后一层时,我们就找到了二叉树的高度,然后我们就可以轻易地计算出中间层的位置,从而打印出中间层的节点。

代码实现
Python
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def print_middle_layer(root):
    if not root:
        return None

    queue = [root]
    i = 0
    while queue:
        size = len(queue)
        level_nodes = []
        for j in range(size):
            node = queue.pop(0)
            level_nodes.append(node)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)

        if i == (size - 1) // 2:
            for node in level_nodes:
                print(node.val, end=' ')
            return

        i += 1
JavaScript
class Node {
  constructor(val, left, right) {
    this.val = val;
    this.left = left;
    this.right = right;
  }
}

function printMiddleLayer(root) {
  if (!root) {
    return null;
  }

  const queue = [root];
  let i = 0;
  while (queue.length) {
    const size = queue.length;
    const levelNodes = [];
    for (let j = 0; j < size; j++) {
      const node = queue.shift();
      levelNodes.push(node);
      if (node.left) {
        queue.push(node.left);
      }
      if (node.right) {
        queue.push(node.right);
      }
    }

    if (i === Math.floor((size - 1) / 2)) {
      const results = levelNodes.map(node => node.val).join(' ');
      console.log(results);
      return;
    }

    i++;
  }
}
总结

通过本文,您已经学会了如何在不求高度的情况下,打印出完美二叉树的中间层。无论是处理完美二叉树还是不完美的二叉树,层序遍历是一种非常有效的方式来遍历二叉树。