二叉树的构建于遍历(python实现)

本文介绍了二叉树的基本概念、性质、特殊类型,详细讲解了如何用Python构建二叉树节点及遍历方法,包括深度优先和广度优先策略,并提供了相应的代码实现。

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

二叉树的构建与遍历

  •  二叉树的基本概念
  • 二叉树的性质
  • 特殊的二叉树
  • 二叉树的节点以及树的构建
  • 二叉树的遍历

 

1. 二叉树的基本概念

二叉树是每个节点最多有两个子树的树结构。通常子树被称为‘左子树’和‘右子树’。

 

2. 二叉树的性质

性质1:在二叉树的第i层上至多有2^{i-1}个节点

性质2:深度为k的二叉树至多有2^k -1个节点

性质3:对于任意一颗二叉树,如果叶子节点为n0,而度数为2的节点总数为n2,则n0 = n2 + 1

证明:度之和 = 分支数 = n1 + 2n2 = n-1, n = n0 + n1 + n2 ,由这两个式子可以得到 n0 = n2 +1

性质4:具有n个节点的完全二叉树的深度必为log_2(n+1)

 

3. 特殊的二叉树

完全二叉树:对于一颗二叉树,假设其深度为h,除了第h层外,其它各层的节点数均已经达到最大值,且第h层的节点从左向右连续紧密的排序

满二叉树:最底层节点达到最大值的完全二叉树

 

4. 二叉树的节点以及二叉树的创建

4.1  二叉树的节点表示

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

 

4.2  二叉树的创建

1.首先添加根节点,根节点初始值为None,先创建节点,然后在树结构中添加根节点,将根节点添加到队列中
2.添加其他节点时,先创建接你单,遍历已经存在队列中的节点,判断他们的左子树和右子树是否都存在,每次添加节点后,将添加的节点放到队列中


代码实现:

class Tree(object):
    def __init__(self, root=None):
        self.root = root

    def add(self, elem):
        '''为树添加节点'''
        #创建一个节点
        node = None(elem)
        if self.root == None:
            self.root = node
        else:
            queue = []
            queue.append(self.root)

        #对已有的节点进行层次遍历
        while queue:
            #弹出队列的第一个元素
            cur = queue.pop(0)
            if cur.lchild == None:
                cur.lchild = Node
                return
            elif cur.rchild == None:
                cur.rchild = Node
                return
            else:
                #如果左右子树都不为空,加入队列继续判断
                queue.append(cur.lchild)
                queue.append(cur.rchild)

 

5.  二叉树的遍历

二叉树的遍历分为深度遍历和广度遍历,深度优先一般用递归,而广度优先一般用队列'''

深度优先遍历:
        深度优先搜索是沿着树的深度遍历树的节点,尽可能深的去探索树的分支,直到叶子节点
            1.前序遍历
            2.中序遍历
            3.后序遍历

代码实现: 

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


def preorder(root):
    '''递归实现先序遍历'''
    if root == None:
        return
    print(root.elem)
    preorder(root.lchild)
    preorder(root.rchild)


def midorder(root):
    '''递归实现中序遍历'''
    if root == None:
        return

    midorder(root.lchild)
    print(root.elem)
    midorder(root.rchild)

def afterorder(root):
    '''递归实现后序遍历'''
    if root == None:
        return

    afterorder(root.lchild)
    afterorder(root.rchild)
    print(root.elem)




if __name__=='__main__':
    root = Node('D',Node('B',Node('A'),Node('C')),Node('E',rchild=Node('G',Node('F'))))
    print('前序遍历:')
    preorder(root)
    print('\n')
    print('中序遍历:')
    midorder(root)
    print('\n')
    print('后序遍历:')
    afterorder(root)
    print('\n')
   

输出结果如下: 

前序遍历:

D

B

A

C

E

G

F





中序遍历:

A

B

C

D

E

F

G





后序遍历:

A

C

B

F

G

E

D

 

广度优先遍历:从上到下,从左到右遍历整棵树,用队列实现

代码实现: 

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



def breadth_travel(root):
    if root == None:
        return
    queue = []
    queue.append(root)
    while queue:
        node = queue.pop(0)
        print(node.elem)
        if node.lchild != None:
            queue.append(node.lchild)
        if node.rchild != None:
            queue.append(node.rchild)



if __name__=='__main__':
    root = Node('D',Node('B',Node('A'),Node('C')),Node('E',rchild=Node('G',Node('F'))))
    
    print('层次遍历:')
    breadth_travel(root)
    print('\n')

 输出结果如下:

层次遍历: 

D

B

E

A

C

G

F

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值