Python 二叉树 | 代码实现

二叉树定义
二叉树是每个节点最多有2个子节点的树结构(也可以为空集,称为空二叉树)
二叉树性质
1.在二叉树的第i层上最多有2^(i-1) 个节点 。(i>=1)
2.二叉树中如果深度为k,那么最多有2^k-1个节点。(k>=1)
几种二叉树
斜树
所有节点只有左节点的称为左斜书,所有节点只有右节点的被称为右斜树
二叉排序树
根结点的关键字大于左子树结点的关键字小于右子树结点的关键字

在这里插入图片描述

平衡二叉树
平衡二叉树是二叉排序树的改进版,目的是为了减少平均查找长度,建出最矮的树,提高查询速度。平衡二叉树需要满足以下两个点

在这里插入图片描述
在这里插入图片描述

平衡因子

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

完全二叉树

在这里插入图片描述

满二叉树

在这里插入图片描述

二叉树的代码实现
# 每个节点的模板class类
class Node:
    def __init__(self,item):
        self.elem = item
        self.lchild = None
        self.rchild = None

class Tree:
    def __init__(self):
        self.root = None
    def add(self,item):
        # 返回节点对象
        node = Node(item)
        # 假如根节点是空,新添加进来的这个节点对象挂在根节点上
        if self.root is None:
            self.root = node
            return
        # 通过层序遍历的方式挂新添加进来的节点
        queue = [self.root]
        while True:
            # 每次从在队列里抛出一个节点
            cur_node = queue.pop(0)
            # 假如左节点没有,把新节点挂在左节点上
            if cur_node.lchild is None:
                cur_node.lchild = node
                return
            # 否则把左节点放进队列,等待遍历
            else:
                queue.append(cur_node.lchild)
            if cur_node.rchild is None:
                cur_node.rchild = node
                return
            else:
                queue.append(cur_node.rchild)
    # 层序遍历(广度遍历)
    def bianlitree(self):
        if self.root == None:
            return
        # 先把根节点放进队列中
        queue = [self.root]
        while queue:
            # 和add的方法逻辑类似,通过队列的方式进行遍历
            cur_node = queue.pop(0)
            print(cur_node.elem)
            if cur_node.lchild is not None:
                queue.append(cur_node.lchild)
            if cur_node.rchild is not None:
                queue.append(cur_node.rchild)
    # 先序遍历
    def probianli(self,cur_node):
        if cur_node == None:
            return
        # 打印当前节点,然后把左节点放进递归
        print(cur_node.elem)
        self.probianli(cur_node.lchild)
        self.probianli(cur_node.rchild)

    # 中序遍历
    def midbianli(self, cur_node):
        if cur_node == None:
            return
        # self.root = cur_node
        self.midbianli(cur_node.lchild)
        print(cur_node.elem)
        self.midbianli(cur_node.rchild)

    # 后序遍历
    def backbianli(self, cur_node):
        if cur_node == None:
            return
        # self.root = cur_node
        self.backbianli(cur_node.lchild)
        self.backbianli(cur_node.rchild)
        print(cur_node.elem)

# 先实例化二叉树
tree = Tree()
# 给树添加上节点
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
print(' 层序遍历')
tree.bianlitree()
print(' 先序遍历')
tree.probianli(tree.root)
print(' 中序遍历')
tree.midbianli(tree.root)
print(' 后序遍历')
tree.backbianli(tree.root)
参考资料
二叉树的代码实现 https://www.bilibili.com/video/BV1ZW411q7eK?t=275&p=3
女生讲解平衡二叉树https://www.bilibili.com/video/BV1d7411u79x
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值