📜  交替按顶层顺序和底层最低顺序打印二叉搜索树的节点(1)

📅  最后修改于: 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]