数据结构-二叉树基本知识

二叉树基本知识

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

树的相关定义

什么是树

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

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

结点的定义及分类

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

图1-1结点(截图自大话数据结构)


结点间的关系

  • 孩子&双亲: 结点的子树的根称为该节点孩子,相应的该结点称为孩子的双亲(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)

如下图:
搜索二叉树

猜你喜欢

转载自blog.csdn.net/learningcoding/article/details/79212611