二叉树及其四种遍历的实现

前言:在数据的组织中,树结构的确是一个突破,因为我们用它实现的一系列算法比使用线性结构要快得多,主要的用途是用来提高查找效率,对于要重复查找的情况效果更佳,如二叉排序树、FP-树。另外可以用来提高编码效率,如哈弗曼树。 本文介绍如何使用Python实现二叉树的层次遍历、先序遍历、中序遍历以及后序遍历。


概念: 

  • 层次遍历(广度优先遍历):把节点的兄弟节点先搜索完了再往孩子节点搜索。
  • 先序遍历:根-左-右
  • 中序遍历:左-根-右
  • 后序遍历:左-右-根

 

实现:

# -*- coding: utf-8 -*-

"""
--------------------------------------------------------
# @Version : python3.7
# @Author  : wangTongGen
# @File    : BinaryTree.py
# @Software: PyCharm
# @Time    : 2019/8/31 20:20
--------------------------------------------------------
"""

class Node(object):
    """节点类"""
    def __init__(self, elem=None, lchild=None, rchild=None):
        self.elem = elem
        self.lchild = lchild
        self.rchild = rchild

class Tree(object):
    """树类"""
    def __init__(self):
        self.root = Node()
        self.myQueue = []

    def add(self, elem):
        """为树添加节点"""
        node = Node(elem)
        if self.root.elem is None: # 根节点为空
            self.root = node
            self.myQueue.append(self.root)
        else:
            treeNode = self.myQueue[0] # 此节点的子树还没有齐
            if treeNode.lchild is None:
                treeNode.lchild = node
                self.myQueue.append(treeNode.lchild)
            else:
                treeNode.rchild = node
                self.myQueue.append(treeNode.rchild)
                self.myQueue.pop(0) # 如果该节点存在右子树,则将节点舍弃

    def front_digui(self, root):
        """利用递归实现先序遍历:根左右"""
        if root is None:
            return
        print(root.elem, end=" ")
        self.front_digui(root.lchild)
        self.front_digui(root.rchild)

    def middle_digui(self, root):
        """利用递归实现中序遍历:左根右"""
        if root is None:
            return
        self.middle_digui(root.lchild)
        print(root.elem, end=" ")
        self.middle_digui(root.rchild)

    def later_digui(self, root):
        """利用递归实现后序遍历:左右根"""
        if root is None:
            return
        self.later_digui(root.lchild)
        self.later_digui(root.rchild)
        print(root.elem, end=" ")

    def level_queue(self, root):
        """利用队列实现层次遍历"""
        if root is None:
            return
        myQueue = []
        node = root
        myQueue.append(node)
        while myQueue:
            node = myQueue.pop(0)
            print(node.elem, end=" ")
            if node.lchild is not None:
                myQueue.append(node.lchild)
            if node.rchild is not None:
                myQueue.append(node.rchild)

if __name__ == '__main__':
    """主函数"""
    elems = range(10)
    tree = Tree()
    for elem in elems:
        tree.add(elem)

    print("队列实现层次遍历:", end=" ")
    tree.level_queue(tree.root)
    print("\n递归实现前序遍历:", end=" ")
    tree.front_digui(tree.root)
    print("\n递归实现中序遍历:", end=" ")
    tree.middle_digui(tree.root)
    print("\n递归实现后序遍历:", end=" ")
    tree.later_digui(tree.root)

效果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值