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

    你可能感兴趣的文章
    oncopy和onpaste
    查看>>
    onCreate中的savedInstanceState作用
    查看>>
    onCreate()方法中的参数Bundle savedInstanceState 的意义用法
    查看>>
    One good websit for c#
    查看>>
    One-Shot学习/一次学习(One-shot learning)
    查看>>
    OneASP 安全公开课,深圳站, Come Here, Feel Safe!
    查看>>
    OneBlog Shiro 反序列化漏洞复现
    查看>>
    oneM2M
    查看>>
    Oneplus5重装攻略
    查看>>
    one_day_one--mkdir
    查看>>
    ONI文件生成与读取
    查看>>
    Vue 项目中实现高效的消息提示与确认对话框功能(模版)
    查看>>
    Online PDF to PNG、JPEG、WEBP、 TXT - toolfk
    查看>>
    onlstm时间复杂度_CRF和LSTM 模型在序列标注上的优劣?
    查看>>
    onlyoffice新版5.1.2版解决中文汉字输入重复等问题
    查看>>
    onnx导出动态输入
    查看>>
    onnx导出动态输入
    查看>>
    onScrollStateChanged无效
    查看>>
    onTouchEvent构造器
    查看>>
    on_member_join 和删除不起作用.如何让它发挥作用?
    查看>>