📌  相关文章
📜  打印二叉树每个级别的中间节点(1)

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

打印二叉树每个级别的中间节点

问题引入

对于一棵二叉树,如何找到每个级别的中间节点呢?比如下图的二叉树:

          1
        /   \
       2     3
      / \   / \
     4   5 6   7

第0级只有根节点1,中间节点是1;第1级有2个节点,中间节点是2;第2级有4个节点,中间节点是5;第3级有两个节点,中间节点是6和7。在这个问题中,我们需要找到每个级别的中间节点,并将其打印出来。

解决方案
思路分析

从题目中可以看出,我们需要找到每个级别的中间节点,那么怎样才能得到每个级别的中间节点呢?我们可以想到先层序遍历树,然后对于每一层,计算节点数目,找到中间的那个节点即可。

代码实现

对于树的层序遍历,我们可以通过队列实现;对于每一层的中间节点数目,我们可以通过计算层数进行判断。下面给出Python实现代码:

def print_mid_nodes(root):
    """
    输出二叉树每个级别的中间节点
    """
    if not root:
        return
    
    queue = [root]
    level = 0
    
    while queue:
        level_size = len(queue)  # 当前层的节点数
        mid = level_size // 2     # 计算中间节点位置
        
        print(f"level {level} mid nodes:", end="")
        
        for i in range(level_size):
            node = queue.pop(0)
            if i == mid:
                print(node.val, end=" ")
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        
        level += 1
        print("")
代码说明

我们定义了一个函数print_mid_nodes,它的输入是树的根节点root。首先,我们判断根节点是否为None,如果是,直接返回。接下来,我们定义一个队列queue保存每一层的节点,将根节点加入队列。同时,我们定义一个变量level,表示当前遍历到的层数。

接下来进入while循环,当队列不为空时,进行以下操作:

  1. 计算当前层数的节点数目,存放在变量level_size中。
  2. 计算当前层数的中间节点位置,存放在变量mid中。
  3. 输出当前层数的中间节点(若节点数为奇数,则输出一个;若节点数为偶数,则输出两个)。
  4. 将下一层的节点加入队列中。
  5. 层数level自增1。

最后,我们完成了遍历操作。

程序测试

下面给出一个测试示例:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 构造测试数据
def build_tree():
    n1 = TreeNode(1)
    n2 = TreeNode(2)
    n3 = TreeNode(3)
    n4 = TreeNode(4)
    n5 = TreeNode(5)
    n6 = TreeNode(6)
    n7 = TreeNode(7)
    
    n1.left = n2
    n1.right = n3
    n2.left = n4
    n2.right = n5
    n3.left = n6
    n3.right = n7
    
    return n1
    
root = build_tree()
print_mid_nodes(root)

上述测试程序会输出以下结果:

level 0 mid nodes:1 
level 1 mid nodes:2 
level 2 mid nodes:5 
level 3 mid nodes:6 7 

结果显示我们成功地找到了每一层的中间节点。

总结

本文介绍了如何找到一棵二叉树每个级别的中间节点。通过对树进行层序遍历,并计算每一层的中间节点位置,我们得到了每一层中的中间节点。这是一个比较简单的算法,但是对于初学者来说还是很有启发意义的。