二叉树基本知识

作者: 醒着的码者 | 来源:发表于2018-01-31 09:25 被阅读62次

    二叉树基本知识

    本文主要介绍二叉树的基本概念和分类。如有不正确之处请多指正。

    树的相关定义

    什么是树

    树是 N 个结点的有限集。 N = 0,表示空数。在任意一个非空树中:

    1. 有且仅有一个特定的称为根的节点。
    2. 当 n > 1 时,其余节点可分为 m (m > 0) 个互不相交的有限集,T1,T2,T3...Tm,其中每个集合本身又是一棵树,并且称为当前根的子树。

    结点的定义及分类

    • 数的结点:是包含一个数据元素及若干指向其字数的分支。
    • 度(Degree): 结点拥有的子树称为结点的度(Degree)
    • 叶子结点(Leaf): 度为 0 的结点称为叶子结点。
    • 分支结点:度不为 0 的结点。也称为非终端结点或内部结点(除根结点外)
    • 树的度: 树的度是树内各分支结点的度的最大值。

    [图片上传失败...(image-f9353e-1517361905227)]


    结点间的关系

    • 孩子&双亲: 结点的子树的根称为该节点孩子,相应的该结点称为孩子的双亲(Parent)。
    • 兄弟(Sibling):同一个双亲的孩子之间互相称为兄弟。
    • 祖先:结点的祖先是从根到该节点所经历分支上的所有结点,这里注意从跟到某个特定的结点有且只有一条路径(原因在于数的定义中不相交的特点)。如上图 J 的祖先只有 E C A 而没有 F。
    • 子孙:以某个结点为根的子树中的任意一个结点都成为改结点的子孙。如上图 B 的子孙有 D G H I。

    树的其他概念:

    • 结点的层级(Level):定义根为第一层,跟的孩子为第二层,孩子的孩子为第三层。一次类推。
    • 树的深度(Depth): 书中结点的最大层次为树的深度,也称为树的高度。注意区分深度
    • 有序树 & 无序树: 如果树中结点的各个子树看成从左到右是有次序的,不能互换的则概述称为有序树,否则为无序树。即左右子树(这里假设只有左右两个孩子),不能调换位置,如果调换位置则不再是原来的树。
    • 森林: 若干个不相交的树的集合。

    树的三种表示方法:

    1. 双亲表示法。
    2. 孩子表示法。
    3. 孩子兄弟表示法。

    双亲表示法

    在每个结点中,设有一个指示器指向其双亲结点到链表中的位置。数据结构为:

    public class MNode<E> {
        private E data;//数据域
        private int parent;//双亲的位置
    }
    

    这种结构却可以轻松找出指定节点的父节点,但当要找出某节点的所有子节点需要遍历整个树,时间花费长。

    孩子表示法

    每个结点有多个指针域,其中每个指针域指向该结点子树的根节点。

    由于上述两种方式不常用就不过多介绍。想知道详细的双亲表示法,孩子表示法表示一个树的代码请自行网上搜索或者参考: 数据结构与算法Java版——树的两种表现方式

    孩子兄弟表示法:

    这种数据存储方式最为常用:

    任意一颗树,它的结点的第一个孩子如果存在就是唯一的,他的右兄弟也是唯一的。我们设置一个指针,分别指向该节点的左孩子和右孩子 则这种表示法方式为孩子兄弟表示方法

    代码表示如下

        class Node<T>{
            T data;
            Node<T> leftChild;
            Node<T> rightChild;
        }
    

    树的常见类型

    • 二叉树 (Binary Tree) :是 n(n≥0)个结点的有限集合,该集合或者为空集,或者由一个根结点和两个互不相交的,分别称为改根节点的左子树和右子树的子树组成。
    • 完全二叉树 (Complete Binary Tree) : 具有 n 个结点的二叉树按层序编号,如果编号为 i(1≤i≤n)的结点与同样深度的满二叉树中编号为 i 的结点在二叉树中的位置相同,则该二叉树称为完全二叉树。 定义很繁琐但是要知道如何判断一个数是否是完全二叉树:
      • 叶子结点只能出现在最下边两层(不信你自己画画)。
      • 最下层的叶子一定集中在左部连续位置。
      • 倒数第二层,若有叶子结点,则一定都在根节点右子树的的连续位置。
      • 如果结点的度为1,则该节点只有左孩子没有右孩子。即不存在只有右孩子的情况
      • 同样结点数的二叉树,完全二叉树深度最小。
      • 如果想判断一个数是不是完全二叉树,只需按照层级从左到右连续编号,如果编到最后一个节点前号码不连续了,则该树肯定不是完全二叉树。
    • 满二叉树 (Full Binary Tree) : 如果一个二叉树中所有分支的节点都存在左子树和右子树,且叶子都在同一层上,则改树为完全二叉树。满二叉树用数组表示方法最为合适,因为数组角标即为结点在二叉树中的位置。
    • 二叉搜索树 (Binary Search Tree): 二叉搜索树是一种特殊的二叉树,也可以称为二叉排序树,二叉查找树。除了具有二叉树的基本性质外,它还具备:

      • 树中每个节点最多有两个子树,通常称为左子树和右子树
      • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值
      • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
      • 它的左右子树仍然是一棵二叉搜索树 (recursive)

    如下图:


    搜索二叉树

    相关文章

      网友评论

        本文标题:二叉树基本知识

        本文链接:https://www.haomeiwen.com/subject/pnqkzxtx.html