zoukankan      html  css  js  c++  java
  • [数据结构与算法] 002—树与二叉树(Python)

    概念

    树是一类重要的非线性数据结构,是以分支关系定义的层次结构

    定义:

    树(tree)是n(n>0)个结点的有限集T,其中: 有且仅有一个特定的结点,称为树的根(root)

    当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,……Tm,其中每一个集合本身又是一棵树,称为根的子树(subtree)

    特点: 树中至少有一个结点——根 树中各子树是互不相交的集合

    基本术语

    • 结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支

    • 结点的度(degree)——结点拥有的子树数 叶子(leaf)——度为0的结点

    • 孩子(child)——结点子树的根称为该结点的孩子

    • 双亲(parents)——孩子结点的上层结点叫该结点的~

    • 兄弟(sibling)——同一双亲的孩子

    • 树的度——一棵树中最大的结点度数

    • 结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……

    • 深度(depth)——树中结点的最大层次数

    • 森林(forest)——m(m0)棵互不相交的树的集合



    二叉树

    二叉树是有限个元素的集合,该集合或者为空、或者有一个称为根节点(root)的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。

    • 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
    • 二叉树的第i层至多有2^{i-1}个结点
    • 深度为k的二叉树至多有2^k-1个结点;
    • 对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

    遍历二叉树

    • 前序遍历
      若树为空,则空操作返回。否则,先访问根节点,然后前序遍历左子树,再前序遍历右子树。(W)型 (中 左 右)
    • 中序遍历
      若树为空,则空操作返回。否则,从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历根节点的右子树。(M)型,(左 中 右)
    • 后续遍历
      若树为空,则空操作返回。否则,从左到右先叶子后节点的方式遍历访问左右子树,最后访问根节点。(左右中)逆时针型 (左 右 中)
    • 层序遍历
      若树为空,则空操作返回。否则,从树的第一层,也就是根节点开始访问,从上到下逐层遍历,在同一层中,按从左到右的顺序结点逐个访问。


    实现方法

    class Node:  
        def __init__(self,value=None,left=None,right=None):  
            self.value=value  
            self.left=left    #左子树
            self.right=right  #右子树
    
    def preTraverse(root, res=[]):  
        '''
        前序遍历
        '''
        if root==None:  
            return 
        res.append(root.value)
        preTraverse(root.left, res)  
        preTraverse(root.right, res)  
        return res
    
    def midTraverse(root, res=[]): 
        '''
        中序遍历
        '''
        if root==None:  
            return  
        midTraverse(root.left, res)  
        res.append(root.value)
        midTraverse(root.right)  
        return res
      
    def afterTraverse(root, res=[]):  
        '''
        后序遍历
        '''
        if root==None:  
            return  
        afterTraverse(root.left)  
        afterTraverse(root.right)  
        res.append(root.value)
        return res
    
    def traverse(root, res=[]):  
        '''
        层次遍历
        '''
        if root==None:  
            return 
        delroot = [root]
        while delroot:
            current = delroot.pop(0)
            res.append(current.value)
            if current.left:
                delroot.append(current.left)
            if current.right:
                delroot.append(current.right)
        return res
    
    
    if __name__=='__main__':
        root=Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'))))
        print('前序遍历:')
        print(preTraverse(root))
        print('中序遍历:')
        print(midTraverse(root))
        print('后序遍历:')
        print(afterTraverse(root))
        print('层次遍历:')
        print(traverse(root))
    
    前序遍历:
    ['D', 'B', 'A', 'C', 'E', 'G', 'F']
    中序遍历:
    ['A', 'B', 'C', 'D', 'E', 'F', 'G']
    后序遍历:
    ['A', 'C', 'B', 'F', 'G', 'E', 'D']
    层次遍历:
    ['D', 'B', 'E', 'A', 'C', 'G', 'F']
    
  • 相关阅读:
    GPU编程和流式多处理器(七)
    GPU编程和流式多处理器(六)
    vue——使用vant轮播组件swipe + flex时,文字抖动问题
    golang 修改字符串
    Go 彻底弄懂return和defer的微妙关系
    Redis 的持久化机制
    Redis 缓存击穿
    Redis 缓存穿透
    Redis 雪崩
    正则验证
  • 原文地址:https://www.cnblogs.com/xianeri/p/10177333.html
Copyright © 2011-2022 走看看