博客
关于我
python数据结构6 -二叉树
阅读量:251 次
发布时间:2019-03-01

本文共 2415 字,大约阅读时间需要 8 分钟。

树与二叉树技术文档

树的定义与特点

树是一种抽象数据类型(ADT),用来模拟具有树状结构的数据集合。树由n(n≥1)个节点组成,每个节点可以有零个或多个子节点,且每个非根节点有且只有一个父节点。树的层次关系从根节点开始定义,根节点为第1层,其子节点为第2层,依此类推。

树的术语解析

  • 节点的度:节点含有的子树个数称为节点的度。
  • 树的度:树中最大的节点度称为树的度。
  • 叶节点:度为零的节点。
  • 父节点:含有子节点的节点称为父节点。
  • 子节点:一个节点的子树根节点称为子节点。
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点。
  • 节点的层次:从根开始定义,根为第1层,其子节点为第2层。
  • 树的高度或深度:树中节点的最大层次。
  • 堂兄弟节点:父节点在同一层的节点互为堂兄弟。
  • 节点的祖先:从根到该节点所经分支上的所有节点。
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 森林:由m(m≥0)棵互不相交的树的集合称为森林。
  • 树的种类

  • 无序树:树中任意节点的子节点之间没有顺序关系。
  • 有序树:树中任意节点的子节点之间有顺序关系。
  • 常见二叉树类型

    • 完全二叉树:除了最底层外,其它层节点数目均已达最大值,且第d层节点从左向右连续排列。
    • 平衡二叉树(AVL树):任意节点的两棵子树高度差不超过1。
    • 排序二叉树:有序二叉树,用于二叉查找。
    • 霍夫曼树:带权路径最短的二叉树。
    • B树:自平衡二叉查找树,支持多级分支。

    树的存储与表示

    树的存储可分为两种方式:

  • 顺序存储:将数据存储在固定数组中,遍历速度较快,但占用空间较大。
  • 链式存储:节点通过指针连接,指针域占用空间不定。
  • 二叉树的性质

  • 二叉树第i层最多有2^(i-1)个节点(i>0)。
  • 深度为k的二叉树最多有2^k - 1个节点(k>0)。
  • 对于任意二叉树,叶节点数N0与度数为2的节点数N2满足N0 = N2 + 1。
  • 完全二叉树的深度为log2(n+1),其中n为节点数。
  • 完全二叉树中,编号为i的节点左孩子为2i,右孩子为2i+1,父节点为i/2(i=1时除外)。
  • 二叉树的代码实现

    节点与树的创建

    class Node(object):    def __init__(self, item):        self.elem = item        self.lchild = None        self.rchild = Noneclass Tree(object):    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 queue:            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 breadth_travel(self):    if self.root is None:        return    queue = [self.root]    while queue:        cur_node = queue.pop(0)        print(cur_node.elem, end=" ")        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 preorder(self, node):    if node is None:        return    print(node.elem, end=" ")    self.preorder(node.lchild)    self.preorder(node.rchild)def inorder(self, node):    if node is None:        return    self.inorder(node.lchild)    print(node.elem, end=" ")    self.inorder(node.rchild)def postorder(self, node):    if node is None:        return    self.postorder(node.lchild)    self.postorder(node.rchild)    print(node.elem, end=" ")

    树的唯一性判断

    通过广度优先和深度优先遍历,可以唯一确定一棵树的结构。

    转载地址:http://vviv.baihongyu.com/

    你可能感兴趣的文章
    pandas,python - 如何在时间序列中选择特定时间
    查看>>
    Spring 框架之 AOP 原理深度剖析
    查看>>
    Pandas:如何按列元素的组合分组,以指示基于不同列的值的同现?
    查看>>
    Pandas:将一列与数据帧的所有其他列进行比较
    查看>>
    PANDA:基于多列对数据表的行运行计算,并将输出存储在新列中
    查看>>
    PandoraFMS 监控软件 SQL注入漏洞复现
    查看>>
    PandoraFMS 监控软件 任意文件上传漏洞复现
    查看>>
    PanTools多网盘登录神器
    查看>>
    Papyrus项目常见问题解决方案
    查看>>
    Parallel.ForEach使用示例
    查看>>
    Parallel.ForEach的基础使用
    查看>>
    parallels desktop for mac安装虚拟机 之parallelsdesktop密钥 以及 parallels desktop安装win10的办公推荐可以提高办公效率...
    查看>>
    parallelStream导致LinkedList遍历时空指针的问题
    查看>>
    Parameter ‘password‘ not found. Available parameters are [md5String, param1, username, param2]
    查看>>
    ParameterizedThreadStart task
    查看>>
    Paramiko exec_命令的实时输出
    查看>>
    Spring security之管理session
    查看>>
    paramiko模块
    查看>>
    param[:]=param-lr*param.grad/batch_size的理解
    查看>>
    spring mvc excludePathPatterns失效 如何解决spring拦截器失效 excludePathPatterns忽略失效 拦截器失效 spring免验证拦截器不起作用
    查看>>