📅  最后修改于: 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循环,当队列不为空时,进行以下操作:
level_size
中。mid
中。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
结果显示我们成功地找到了每一层的中间节点。
本文介绍了如何找到一棵二叉树每个级别的中间节点。通过对树进行层序遍历,并计算每一层的中间节点位置,我们得到了每一层中的中间节点。这是一个比较简单的算法,但是对于初学者来说还是很有启发意义的。