python 之二叉树存储、建立及遍历实现

本文介绍了二叉树的概念,包括满二叉树和完全二叉树的定义。接着详细阐述了二叉树的两种存储方式:顺序存储(适用于完全二叉树)和链式存储(包括二叉链表和三叉链表)。在顺序存储中,给出了计算结点双亲、左右孩子下标的规则,并提到其不适用于非完全二叉树。最后,虽然没有给出具体代码,但暗示了二叉树的建立及遍历是后续内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

满二叉树:

在一棵二叉树中,若所有分支结点都有左子树和右子树,并且所有的叶子结点只在最大层次出现,这样的二叉树称为满二叉树。深度为h的二叉树,若其结点数为$2^{h}-1$,则该二叉树为满二叉树。

完全二叉树:

对于一棵深度为k的二叉树,如果树中每一个结点都与深度为k的满二叉树中的同一位置有相同的编号,该二叉树就是完全二叉树,完全二叉树的叶子结点集中在最下面两层,对于任一结点,若其右子树的深度为h,则其左子树的深度为h或h+1。

二叉树的存储

顺序存储:

从二叉树的根结点开始,按照层次从小到大、同一层从左到右,将所有结点依次存储在一组地址连续的存储单元中。

如果是完全二叉树,则从根结点开始,按照层次从小到大、同一层从左到右的顺序对结点编号后存入数组中,即编号为i的结点存在数组下标为i-1的分量中。
按照以下规则可以求出双亲结点、左孩子、右孩子在数组中的下标(数组下标从0开始,二叉树编号从1开始):

  1. 对完全二叉树中任一编号为i的结点,如果2i > n,则编号i是叶子结点,否则2i为编号为i结点的左孩子;如果2i+1>n,则编号i无右孩子,否则2i+1为编号为i节点的右孩子。
  2. 对完全二叉树中任一编号为i的结点,如果i= 1,则i为根结点,无双亲,否则编号为i的结点的双亲为[i / 2](其中[i / 2]为不大于i / 2的最大整数)。

如果是非完全二叉树,则需要补位,也就是说补成完全二叉树,这样会浪费存储空间。
所以该方法并不适合非完全二叉树。

链式存储:

链式存储的每个结点包括结点值data、左孩子(leftchild)和右孩子(rightchild),也被称为二叉链表。
python表示:

class LinkedBinaryTreeNode(object)def __init__(self):
        self.data = "#"
        self.LeftChild = None
        self.RightChild = None

二叉链表访问双亲较为困难,所以可以再加一个parent域,用于存放双亲结点,也被称为三叉链表。

二叉树的建立及遍历

'''队列'''
class CircularSequenceQueue():
    def __init__(self):
        self.MaxQueueSize = 10
        self.s = [None for x in range(0,self.MaxQueueSize)]
        self.front = 0
        self.rear = 0
    '''当前队列是否为空'''
    def IsEmptyQueue(self):
        if self.front == self.rear:
            iQueue = True
        else:
            iQueue = False  
        return iQueue
    '''元素进队'''
    def EnQueue(self,x):
        if (self.rear+1)% self.MaxQueueSize != self.front:
            self.rear = (self.rear+1)% self.MaxQueueSize
            self.s[self.rear] = x
        else:
            print(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值