二叉树 - 从最后一层遍历到根的最优雅的方式
Binary Tree - Most elegant way to traverse from the last level to root
我正在寻找一个允许我遍历二叉搜索树的实现,从最后一层开始从左到右到根,例如:
A
B C
D E G
应该return:[D, E, G, B, C, A]
。我对递归方法或迭代方法都感兴趣。
我不确定我在 Python 中的解决方案是否足够优雅,但也许它会有所帮助。
简介
让我们考虑一个例子如下:
8
/ \
5 10
/ \ \
4 6 12
预期输出为 4, 6, 12, 5, 10, 8
。但是如何实现呢?
步骤 1 - BFS
让我们做一个稍作修改的 BFS - 首先遍历右侧 child,然后遍历左侧。
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)
我正在寻找一个允许我遍历二叉搜索树的实现,从最后一层开始从左到右到根,例如:
A
B C
D E G
应该return:[D, E, G, B, C, A]
。我对递归方法或迭代方法都感兴趣。
我不确定我在 Python 中的解决方案是否足够优雅,但也许它会有所帮助。
简介
让我们考虑一个例子如下:
8
/ \
5 10
/ \ \
4 6 12
预期输出为 4, 6, 12, 5, 10, 8
。但是如何实现呢?
步骤 1 - BFS
让我们做一个稍作修改的 BFS - 首先遍历右侧 child,然后遍历左侧。
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)