微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

二叉树 - 从最后一层遍历到根的最优雅的方式

如何解决二叉树 - 从最后一层遍历到根的最优雅的方式

我正在寻找一种实现,它允许我遍历二叉搜索树,从最后一级从左到右到根,例如:

                 A
               B   C
             D  E    G

应该返回:[D,E,G,B,C,A]。我对递归方法或迭代方法都感兴趣。

解决方法

我不确定我在 Python 中的解决方案是否足够优雅,但也许它会有所帮助。

简介

让我们考虑如下示例:

                   8
                 /   \
                5    10
               / \     \  
              4   6    12

预期输出为 4,6,12,5,10,8。但如何实现这一目标?

第 1 步 - BFS

让我们稍微修改一下做一个 BFS - 首先遍历一个右孩子,然后一个左孩子。

def bfs(node):
    q  = []
    q.append(node)
    while q:
        current = q.pop(0)
        print (current.value,end = ' ')
        if current.right:
            q.append(current.right)
        if current.left:
            q.append(current.left)

输出如下:

8、10、5、12、6、4

输出基本上与预期输出相反!

第 2 步 - 反向 BFS 输出

为此,引入一个堆栈变量来保存队列的当前元素。

def bfsFromBottomToTop(node):
    q  = []
    q.append(node)
    st = [] # create a stack variable
    while q:
        current = q.pop(0)
        st.append(current.value) # push the current element to the stack
        if current.right:
            q.append(current.right)
        if current.left:
            q.append(current.left)

然后,您可以在方法结束时将所有元素从堆栈中弹出,如下所示:

    ...
    while st:
        print(st.pop(),end = ' ')
    ...

4 6 12 5 10 8

完整代码

这里是完整的代码,您可以自己尝试一下。

class Node:
    def __init__(self,value):
        self.left = None
        self.right = None
        self.value = value

def insert(node,value):
    if node is None:
        return Node(value)

    if node.value > value:
        node.left = insert(node.left,value)
    else:
        node.right = insert(node.right,value)

    return node

def bfsFromBottomToTop(node):
    q  = []
    q.append(node)
    st = []
    while q:
        current = q.pop(0)
        st.append(current.value)
        if current.right:
            q.append(current.right)
        if current.left:
            q.append(current.left)

    while st:
        print(st.pop(),end = ' ')

root = Node(8)
insert(root,5)
insert(root,10)
insert(root,6)
insert(root,4)
insert(root,12)
bfsFromBottomToTop(root)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。