博客
关于我
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/

    你可能感兴趣的文章
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>