为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

二叉树

来自NOCOW
跳转到: 导航, 搜索

本文在GNU自由文档许可证之条款下提供 在计算机科学中,二叉树是每个结点最多有两个子树有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树二叉堆

二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^(i-1)个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。

树和二叉树的三个主要差别:

  1. 树的结点个数至少为1,而二叉树的结点个数可以为0;
  2. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;
  3. 树的结点无左、右之分,而二叉树的结点有左、右之分。


目录

[编辑] 图论中的定义

二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有根二叉树还要满足根结点的度不大于2。有了根结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做森林。

[编辑] 二叉树的类型

二叉树是一个有根,并且每个结点最多有2个子结点。

满二叉树是每个结点都有0个或2个子结点的树。

一棵有n个结点的二叉树,按满二叉树的编号方式对它进行编号,若树中所有结点和满二叉树1~n编号完全一致,则称该树为完全二叉树

一棵深度为k且有2k − 1个结点的二叉树称为满二叉树,这种树的特点是每一层上的结点数都是最大结点数。在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干结点,则此二叉树为完全二叉树。具有n个结点的完全二叉树的深度为log2n + 1。深度为k的完全二叉树至少有2k − 1个结点,至多有2k − 1个结点。

[编辑] 存储二叉树的方法

编程语言中能用多种方法来构造二叉树。在使用记录的编程语言中,二叉树通常用树结点结构来存储。有时也包含指向唯一的父节点的指针。如果一个结点的子结点个数小于2,一些子结点指针可能为空值,或者为特殊的哨兵结点。

二叉树也可以用数组来存储,而且如果这是完全二叉树,这种方法不会浪费空间。用这种紧凑排列,如果一个结点的索引为i,它的子结点能在索引2i+1和2i+2找到,并且它的父节点(如果有)能在索引floor((i-1)/2)找到(假设根节点的索引为0)。这种方法更有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。然而,它需要连续的存储空间,这样在存储高度为hn个结点组成的树时将会浪费很多空间。


[编辑] 顺序存储表示

[编辑] 二叉链表存储表示

[编辑] 三叉链表存储表示

[编辑] 二叉树的遍历

二叉树的遍历可分为深度(算法类DFS)和宽度(即按行遍历)两种,而深度遍历又可以分为前序、中序和后序遍历三种。

[编辑] 一般有序树的表示方法

[编辑] 线索二叉树 (threaded binary tree)

个人工具