数据结构-二叉树基本知识
2018-01-31 01:55
239 查看
二叉树基本知识
本文主要介绍二叉树的基本概念和分类。如有不正确之处请多指正。树的相关定义
什么是树
树是 N 个结点的有限集。 N = 0,表示空数。在任意一个非空树中:有且仅有一个特定的称为根的节点。
当 n > 1 时,其余节点可分为 m (m > 0) 个互不相交的有限集,T1,T2,T3…Tm,其中每个集合本身又是一棵树,并且称为当前根的子树。
结点的定义及分类
数的结点:是包含一个数据元素及若干指向其字数的分支。度(Degree): 结点拥有的子树称为结点的度(Degree)。
叶子结点(Leaf): 度为 0 的结点称为叶子结点。
分支结点:度不为 0 的结点。也称为非终端结点或内部结点(除根结点外)
树的度: 树的度是树内各分支结点的度的最大值。
结点间的关系
孩子&双亲: 结点的子树的根称为该节点孩子,相应的该结点称为孩子的双亲(Parent)。兄弟(Sibling):同一个双亲的孩子之间互相称为兄弟。
祖先:结点的祖先是从根到该节点所经历分支上的所有结点,这里注意从跟到某个特定的结点有且只有一条路径(原因在于数的定义中不相交的特点)。如上图 J 的祖先只有 E C A 而没有 F。
子孙:以某个结点为根的子树中的任意一个结点都成为改结点的子孙。如上图 B 的子孙有 D G H I。
树的其他概念:
结点的层级(Level):定义根为第一层,跟的孩子为第二层,孩子的孩子为第三层。一次类推。树的深度(Depth): 书中结点的最大层次为树的深度,也称为树的高度。注意区分度与深度。
有序树 & 无序树: 如果树中结点的各个子树看成从左到右是有次序的,不能互换的则概述称为有序树,否则为无序树。即左右子树(这里假设只有左右两个孩子),不能调换位置,如果调换位置则不再是原来的树。
森林: 若干个不相交的树的集合。
树的三种表示方法:
双亲表示法。孩子表示法。
孩子兄弟表示法。
双亲表示法
在每个结点中,设有一个指示器指向其双亲结点到链表中的位置。数据结构为: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)
如下图:
相关文章推荐
- 算法导论第10章 基本数据结构之二叉树
- 数据结构复习-二叉树基本操作
- 二叉树的基本知识
- 数据结构 — 二叉树的基本操作实现(递归算法)
- 基本数据结构:二叉树(binary tree)
- 最基本的数据结构知识
- 【 数据结构】实现二叉树以及其基本操作
- 小白学数据结构——二、树与堆(基本概念及二叉树、二叉堆的python实现)
- 数据结构基本知识
- 数据结构:二叉树的基本操作(JAVA实现)
- 基本数据结构学习总结: 二叉树的基本操作
- PHP数据结构之八 树与二叉树基本概念
- 基本数据结构学习笔记——树与二叉树
- 【数据结构】线索化二叉树的基本操作
- 基本数据结构:建立二叉树 和 二叉树的顺序遍历
- 基本数据结构之二叉树
- 第7次数据结构上机--树和二叉树的基本运算实现
- 知识布局-数据结构-搜索二叉树
- 多核计算与程序设计 - 08 基本算法和数据结构 之四 二叉树
- C语言基本数据结构之四(线性,对分,二叉树查找及二叉树删除)