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

    你可能感兴趣的文章
    opencv之namedWindow,imshow出现两个窗口
    查看>>
    opencv之模糊处理
    查看>>
    Opencv介绍及opencv3.0在 vs2010上的配置
    查看>>
    OpenCV使用霍夫变换检测图像中的形状
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    OpenCV保证输入图像为三通道
    查看>>
    OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    查看>>
    opencv图像分割2-GMM
    查看>>
    opencv图像分割3-分水岭方法
    查看>>
    opencv图像切割1-KMeans方法
    查看>>
    OpenCV图像处理篇之阈值操作函数
    查看>>
    opencv图像特征融合-seamlessClone
    查看>>
    OpenCV图像的深浅拷贝
    查看>>
    OpenCV在Google Colboratory中不起作用
    查看>>
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | CV开发者必须懂的9种距离度量方法,内含欧氏距离、切比雪夫距离等(建议收藏)
    查看>>
    OpenCV学堂 | OpenCV中支持的人脸检测方法整理与汇总
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV学堂 | YOLOv8与YOLO11自定义数据集迁移学习效果对比
    查看>>