python实现二叉树的前、中、后序遍历及按层遍历

需求:

python代码实现二叉树的:
1. 前序遍历,打印出遍历结果
2. 中序遍历,打印出遍历结果
3. 后序遍历,打印出遍历结果
4. 按树的level遍历,打印出遍历结果
5. 结点的下一层如果没有子节点,以‘N’代替

方法:

  1. 使用defaultdict或者namedtuple表示二叉树
  2. 使用StringIO方法,遍历时写入结果,最后打印出结果
  3. 打印结点值时,如果为空,StringIO()写入‘N ’
  4. 采用递归访问子节点

代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# test tree as below:
'''
           1
         /   \
        /     \
       /       \
      /         \
     2           3
    / \         / \
   /   \       /   \
   4    5     6     N
  / \  / \   / \
 7  N N   N 8   9
/ \        / \  / \   
N  N      N   N N N
'''

from collections import namedtuple
from io import StringIO

#define the node structure
Node = namedtuple('Node', ['data', 'left', 'right'])
#initialize the tree
tree = Node(1,
            Node(2,
                 Node(4,
                      Node(7, None, None),
                      None),
                 Node(5, None, None)),
            Node(3,
                 Node(6,
                      Node(8, None, None),
                      Node(9, None, None)),
                 None))
#read and write str in memory
output = StringIO()


#read the node and write the node's value
#if node is None, substitute with 'N '
def visitor(node):
    if node is not None:
        output.write('%i ' % node.data)
    else:
        output.write('N ')


#traversal the tree with different order
def traversal(node, order):
    if node is None:
        visitor(node)
    else:
        op = {
                'N': lambda: visitor(node),
                'L': lambda: traversal(node.left, order),
                'R': lambda: traversal(node.right, order),
        }
        for x in order:
            op[x]()


#traversal the tree level by level
def traversal_level_by_level(node):
    if node is not None:
        current_level = [node]
        while current_level:
            next_level = list()
            for n in current_level:
                if type(n) is str:
                    output.write('N ')
                else:
                    output.write('%i ' % n.data)
                    if n.left is not None:
                        next_level.append(n.left)
                    else:
                        next_level.append('N')
                    if n.right is not None:
                        next_level.append(n.right)
                    else:
                        next_level.append('N ')

            output.write('\n')
            current_level = next_level


if __name__ == '__main__':
    for order in ['NLR', 'LNR', 'LRN']:
        if order == 'NLR':
            output.write('this is preorder traversal:')
            traversal(tree, order)
            output.write('\n')
        elif order == 'LNR':
            output.write('this is inorder traversal:')
            traversal(tree, order)
            output.write('\n')
        else:
            output.write('this is postorder traversal:')
            traversal(tree, order)
            output.write('\n')

    output.write('traversal level by level as below:'+'\n')
    traversal_level_by_level(tree)

    print(output.getvalue())

测试使用的tree截图如下:

csdn博客不能在代码注释中正确显示topo ..

这里写图片描述

运行结果:

这里写图片描述


参考:
http://www.laurentluce.com/posts/binary-search-tree-library-in-python/

http://articles.leetcode.com/how-to-pretty-print-binary-tree

https://wizardforcel.gitbooks.io/liaoxuefeng/content/py3/60.html

http://stackoverflow.com/questions/13674772/printing-out-a-binary-search-tree-with-slashes

https://www.reddit.com/r/learnprogramming/comments/14681r/printing_out_a_binary_search_tree_in_level_order/

http://articles.leetcode.com/how-to-pretty-print-binary-tree/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值