📅  最后修改于: 2023-12-03 15:36:06.862000             🧑  作者: Mango
给定一个二叉搜索树,实现一个函数print_top_bottom()来交替打印顶层顺序和底层最低顺序的节点,其中顶层顺序是从上到下的顺序,底层最低顺序是从下到上的顺序。
二叉树如下:
9
/ \
4 12
/ \
1 6 23
/
0 8
输出结果如下:
9, 4, 12, 23, 6, 8, 1, 0
本题可以使用两个栈来实现,一个栈来存储顶层节点,一个栈来存储底层节点,具体步骤如下:
1.将根节点存入顶层节点的栈中
2.从顶层节点栈中取出一个节点,将其值存入结果数组中,并将它的左右子节点存入底层节点的栈中
3.当顶层节点栈为空时,说明当前层已经遍历完了,将底层节点栈中的节点按照出栈的顺序存入临时数组中,并将该临时数组添加到结果数组的末尾
4.交替更换顶层节点栈和底层节点栈,重复上述步骤,直到所有节点都遍历完
class Node:
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left
self.right = right
def print_top_bottom(root):
if not root:
return []
res = []
top_stack = [root]
bottom_stack = []
is_top_level = True
while top_stack or bottom_stack:
level_res = []
if is_top_level:
while top_stack:
node = top_stack.pop()
level_res.append(node.value)
if node.left:
bottom_stack.append(node.left)
if node.right:
bottom_stack.append(node.right)
else:
while bottom_stack:
node = bottom_stack.pop()
level_res.append(node.value)
if node.right:
top_stack.append(node.right)
if node.left:
top_stack.append(node.left)
res.append(level_res)
is_top_level = not is_top_level
return [val for sublist in res for val in sublist]