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

    你可能感兴趣的文章
    npm install 报错 fatal: unable to connect to github.com 的解决方法
    查看>>
    npm install 报错 no such file or directory 的解决方法
    查看>>
    npm install 权限问题
    查看>>
    npm install报错,证书验证失败unable to get local issuer certificate
    查看>>
    npm install无法生成node_modules的解决方法
    查看>>
    npm install的--save和--save-dev使用说明
    查看>>
    npm node pm2相关问题
    查看>>
    npm run build 失败Compiler server unexpectedly exited with code: null and signal: SIGBUS
    查看>>
    npm run build报Cannot find module错误的解决方法
    查看>>
    npm run build部署到云服务器中的Nginx(图文配置)
    查看>>
    npm run dev 和npm dev、npm run start和npm start、npm run serve和npm serve等的区别
    查看>>
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>