补充一下二叉树三种遍历代码实现,同样是纯coding,写熟完事,思路就不赘述。
一.二叉树构建
假设下图是我们的树:

构建:
class TreeNode(object):
def __init__(self,value=None,left=None,right = None):
self.value = value
self.left = left
self.right = right
def visit_value(self):
print(self.value,end=' ')
node1 = TreeNode(1)
node2 = TreeNode(2)
node3 = TreeNode(3)
node4 = TreeNode(4)
node5 = TreeNode(5)
node6 = TreeNode(6)
node7 = TreeNode(7)
node1.left = node2
node1.right = node3
node2.left = node4
node2.right = node5
node3.left = node6
node3.right = node7
二.递归
1.前序遍历
简单来说就是按头—左—右遍历:
def PreOrder_recursion(t_node):
'''
前序遍历
:param t_node:
:return:
'''
if t_node:
t_node.visit_value()
PreOrder_recursion(t_node.left)
PreOrder_recursion(t_node.right)
return
PreOrder_recursion(node1) #output:1 2 4 5 3 6 7
2.中序遍历
简单来说就是按左—头—右遍历:
def InOrder_recursion(t_node):
'''
中序遍历
:param t_node:
:return:
'''
if t_node:
InOrder_recursion(t_node.left)
t_node.visit_value()
InOrder_recursion(t_node.right)
return
InOrder_recursion(node1) #output:4 2 5 1 6 3 7
3.后序遍历
简单来说就是按左—右—头遍历:
def PostOrder_recursion(t_node):
'''
后序遍历
:param t_node:
:return:
'''
if t_node:
PostOrder_recursion(t_node.left)
PostOrder_recursion(t_node.right)
t_node.visit_value()
return
PostOrder_recursion(node1) #output:4 5 2 6 7 3 1
三.非递归(栈)
非递归的方式就引入一个栈或两个栈就行,出栈的时候打印。
python的栈可以用列表的append()和pop()模拟实现。
1.前序遍历
单栈
def PreOrder_stack(t_node):
'''
前序遍历
:param t_node:
:return:
'''
stack = []
stack.append(t_node)
while(len(stack)!=0):
node = stack.pop()
node.visit_value()
if node.right:stack.append(node.right) #先右子节点入栈
if node.left:stack.append(node.left) #后左子节点入栈
PreOrder_stack(node1) #output:1 2 4 5 3 6 7
2.中序遍历
单栈
def InOrder_stack(t_node):
'''
中序遍历
:param t_node:
:return:
'''
stack = []
while(t_node or len(stack)!=0):
while(t_node):
stack.append(t_node)
t_node = t_node.left
node = stack.pop()
node.visit_value()
t_node = node.right
InOrder_stack(node1) #output:4 2 5 1 6 3 7
3.后序遍历
双栈,多引入一个收集栈,可以从中序遍历变形而来。第一个栈先头再右左,弹出后将当前节点放到收集栈,然后先左再右进第一个栈,周而复始。最后单独打印收集栈。
def PostOrder_stack(t_node):
'''
后序遍历,多引入一个收集栈
:param t_node:
:return:
'''
if t_node:
stack = []
c_stack = [] #收集栈
stack.append(t_node)
while(len(stack)!=0):
node = stack.pop()
c_stack.append(node)
if node.left:stack.append(node.left)
if node.right:stack.append(node.right)
while(len(c_stack)!=0):
node=c_stack.pop()
node.visit_value()
PostOrder_stack(node1) #output:4 5 2 6 7 3 1
其实二叉树的遍历写法很多的,感觉熟练掌握六种足够,剩下的看一下。查找了相关资料,这个帖子方法比较多,单栈、双栈、递归、按层遍历都有:https://blog.csdn.net/wayne566/article/details/79106372

本文介绍了如何使用Python实现二叉树的递归和非递归遍历,包括前序、中序和后序三种方式。在递归部分,详细解释了每种遍历的顺序;而在非递归部分,利用栈来实现遍历,特别是后序遍历采用双栈策略。提供了一个资源链接以了解更多的遍历方法。
递归+非递归的二叉树前序、中序、后序遍历实现&spm=1001.2101.3001.5002&articleId=120136068&d=1&t=3&u=500da261657b4d7883827cc0bc5052d4)
3873

被折叠的 条评论
为什么被折叠?



