Python实现普通二叉树

本文详细介绍了如何使用Python实现二叉树数据结构,包括节点类和二叉树类的定义,以及添加节点、遍历、获取高度、叶节点和节点数等核心功能。

Python实现普通二叉树

二叉树是每个节点最多有两个子树的树结构,本文使用Python来实现普通的二叉树。

关于二叉树的介绍,可以参考:https://blog.csdn.net/weixin_43790276/article/details/104737870

一、实现节点类

所有树结构都是由一个一个的节点构成的,本文使用链式的方式来实现二叉树,所以先实现一个节点类。

# coding=utf-8
class Node(object):
    """节点类"""
    def __init__(self, data, left_child=None, right_child=None):
        self.data = data
        self.parent = None
        self.left_child = left_child
        self.right_child = right_child

在二叉树中添加节点时,要先创建节点,有了节点类,实例化一个节点类的实例即可,节点初始化时是一个孤立的节点,指向的父节点、左子节点、右子节点都为空。将节点“挂”到树上(添加到树中)后,才属于树的一部分。

二、实现二叉树类

实现一个二叉树的类 BinaryTree ,创建二叉树时,实例化一个 BinaryTree 类的实例即可。

class BinaryTree(object):
    """二叉树类"""
    def __init__(self):
        self.__root = None
        self.prefix_branch = '├'
        self.prefix_trunk = '|'
        self.prefix_leaf = '└'
        self.prefix_empty = ''
        self.prefix_left = '─L─'
        self.prefix_right = '─R─'

    def is_empty(self):
        return not self.__root

    @property
    def root(self):
        return self.__root

    @root.setter
    def root(self, data):
        self.__root = Node(data)

    def show_tree(self):
        if self.is_empty():
            print('空二叉树')
            return
        print('-' * 20)
        print(self.__root.data)
        self.__print_tree(self.__root)
        print('-' * 20)

    def __print_tree(self, node, prefix=None):
        if prefix is None:
            prefix, prefix_left_child = '', ''
        else:
            prefix = prefix.replace(self.prefix_branch, self.prefix_trunk)
            prefix = prefix.replace(self.prefix_leaf, self.prefix_empty)
            prefix_left_child = prefix.replace(self.prefix_leaf, self.prefix_empty)
        if self.has_child(node):
            if node.right_child is not None:
                print(prefix + self.prefix_branch + self.prefix_right + str(node.right_child.data))
                if self.has_child(node.right_child):
                    self.__print_tree(node.right_child, prefix + self.prefix_branch + ' ')
            else:
                print(prefix + self.prefix_branch + self.prefix_right)
            if node.left_child is not None:
                print(prefix + self.prefix_leaf + self.prefix_left + str(node.left_child.data))
                if self.has_child(node.left_child):
                    prefix_left_child += '  '
                    self.__print_tree(node.left_child, self.prefix_leaf + prefix_left_child)
            else:
                print(prefix + self.prefix_leaf + self.prefix_left)

    def has_child(self, node):
        return node.left_child is not None or node.right_child is not None

    def __str__(self):
        return str(self.__class__)

一棵二叉树,只要先找到树的根节点(Root),就可以依次根据节点的父子关系找到所有节点,所以初始化一棵二叉树时,只要先指向树的根节点即可,在没有添加节点到二叉树中时,树是一棵空二叉树,树的根指向为空。

在初始化二叉树时,树的根设置为私有属性,这样做是有必要的,保证根节点的稳定。但是又需要通过实例对象来操作树的根,所以使用 @property 加 @root.setter 提供一对方法供实例对象使用,可以获取或设置二叉树的根节点。

同时,还实现了判断二叉树是否为空的 is_empty() 方法和按树形结构打印二叉树的 show_tree() 方法,在实现完全二叉树的另一篇文章里面有说明。可以参考:https://blog.csdn.net/weixin_43790276/article/details/104033490

三、二叉树添加节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小斌哥ge

非常感谢,祝你一切顺利。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值