二叉树的遍历及其代码实现

二叉树的遍历及其代码实现

前言

二叉树的遍历及其代码实现。

一、二叉树的遍历

二叉树的遍历分4种:前序遍历、中序遍历、后序遍历、层次遍历。
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根

二、二叉树的遍历代码实现

1.递归写法

前序遍历、中序遍历、后序遍历的递归写法:

# -*- coding:utf-8 -*-
#@Time : 2020/12/30 0030 下午 17:04
#@Author: 疏窗泛影
#@File : BinaryTree.py

class TreeNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

def create_binary_tree(input_list=[]):
    """
    构建二叉树
    :param input_list: 
    :return: 
    """""
    if input_list is None or len(input_list) == 0:
        return None
    data = input_list.pop(0)
    if data is None:
        return None
    node = TreeNode(data)
    node.left = create_binary_tree(input_list)
    node.right = create_binary_tree(input_list)
    return node

def pre_order_traversal(node):
    """
    前序遍历
    :param node:
    :return:
    """
    if node is None:
        return
    print(node.data)
    pre_order_traversal(node.left)
    pre_order_traversal(node.right)
    return node

def in_order_traversal(node):
    """
    中序遍历
    :param node:
    :return:
    """
    if node is None:
        return
    in_order_traversal(node.left)
    print(node.data)
    in_order_traversal(node.right)
    return node

def post_order_traversal(node):
    """
    后序遍历
    :param node:
    :return:
    """
    if node is None:
        return
    post_order_traversal(node.left)
    post_order_traversal(node.right)
    print(node.data)
    return node

if __name__ == '__main__':
    my_input_list = list([2,4,8,7,9,5,6,None,3,2,4,6,None])
    root = create_binary_tree(my_input_list)
    print("前序遍历:")
    pre_order_traversal(root)
    print("中序遍历:")
    in_order_traversal(root)
    print("后序遍历:")
    post_order_traversal(root)

1.非递归写法

非递归写法借助栈是实现,利用栈的回溯特性。其中非递归后序遍历借用双栈。

def pre_order_traversal_with_stack(node):
    """
    非递归前序遍历 借助栈实现
    :param nade:
    :return:
    """
    stack = []
    while node is not None or len(stack) > 0:
        while node is not None:
            print(node.data)
            stack.append(node)
            node = node.left
        if len(stack) > 0:
            node = stack.pop()
            node = node.right

def in_order_traversal_with_stack(node):
    """
    非递归中序遍历 借助栈实现
    :param nade:
    :return:
    """
    stack = []
    while node is not None or len(stack) > 0:
        while node is not None:
            stack.append(node)
            node = node.left
        if len(stack) > 0:
            node = stack.pop()
            print(node.data)
            node = node.right

def post_order_traversal_with_stack(node):
    """
    非递归后序遍历 借助栈实现
    :param nade:
    :return:
    """
    stack1 = []
    stack2 = []
    stack1.append(node)
    while stack1:
        node = stack1.pop()
        stack2.append(node)
        if node.left:
            stack1.append(node.left)
        if node.right:
            stack1.append(node.right)
    while stack2:
        print(stack2.pop().data)
    return

层次遍历

def level_order_travarsal(node):
    """
    层次遍历
    :param node:
    :return:
    """
    queue = Queue()
    queue.put(node)
    while not queue.empty():
        node = queue.get()
        print(node.data)
        if node.left is not None:
            queue.put(node.left)
        if node.right is not None:
            queue.put(node.right)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值