如何解决二叉树 - 从最后一层遍历到根的最优雅的方式
我正在寻找一种实现,它允许我遍历二叉搜索树,从最后一级从左到右到根,例如:
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 举报,一经查实,本站将立刻删除。