(python)递归+非递归的二叉树前序、中序、后序遍历实现

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

补充一下二叉树三种遍历代码实现,同样是纯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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值