树和二叉树知识点总结

[size=large]树[/size]
1.树是一种非线性的数据结构,它是由n个有限结点组成有层次关系的集合.

2.树具有以下特点,可以根据这些特点来判断一个数据结构是否是树
•每个结点具有0个或多个子结点
•每个子结点只有一个父结点
•没有前驱的结为根结点
•除了根结点外,每个子结点又可以由m棵不相关的子树组成

树形结构是以分支关系定义的数据结构(非线性结构和线性结构,个人理解为有无分支的区别),相比队列,树的区别在于它的数据不是以一条线的形式组织
树分为自由树各有根树,自由树暂且不讨论(离散数学里面有提到,但是和现阶段编程没关系)有根树是由n个节点组成,当n=0时,为空树,不由为非空树 每个非空树有且只有一个根节点,每个根节点下有一或者多个树;
ps:注意,树的定义用到了递归的概念,根节点下有树,而这些树的根节点,恰恰就是它的下层节点

下面介绍 一些有关树的术语
1. 结点(node)包含数据项和指向其它节点 的分支

2. 结点的度(degree of node):结点所拥有的子树个数

3. 树的度(degree of tree):树中各结点度的最大值

4. 叶子结点(leaf node)即度为0的结点 又叫终端结点

5. 分支结点(branch node) 除叶结点以外的其它结点,又叫非终端结点

6. 结点的层次(level of node):从根结点到某结点所经路径上的分支数称为该结点的层次。根结点的层次为1,其余结点为其父结点的层次+1

7. 树的深度(depth):树中结点的最大层次数


[size=large]二叉树[/size]
[img]
[img]http://dl.iteye.com/upload/attachment/0083/6293/605545ce-e355-3265-9b1b-2d3521d51384.jpg[/img]
[/img]
和树一样,二叉树也是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树——(a);

(2)只有一个根结点的二叉树——(b);
(3)只有左子树——(c);
(4)只有右子树——(d);
(5)完全二叉树——(e)
注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。
树和二叉树的2个主要差别:

   1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

   2. 树的结点无左、右之分,而二叉树的结点有左、右之分。 (我觉得这个才是本质区别)
[size=medium]二叉树的性质[/size]
(1) 在二叉树中,第i层的结点总数不超过2^(i-1);
(2) 深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点;
(3) 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
引入两个 概念:

满二叉树(Full Binary Tree):
除最后一层无任何子节点外,每一层上的所有结点都有两个子结点(最后一层上的无子结点的结点为叶子结点)。也可以这样理解,除叶子结点外的所有结点均有两个子结点。节点数达到最大值。所有叶子结点必须在同一层上.

(4) 具有n个结点的完全二叉树的深度为int(log2n)+1
(5)有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
若I为结点编号则 如果I<>1,则其父结点的编号为I/2;
如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;
如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。
(6)给定N个节点,能构成h(N)种不同的二叉树。
[size=large]二叉树的存储表示[/size]
1.顺序存储结构(数组)

二叉树的顺序存储,就是用一组连续的存储单元存放二叉树中的结点。因此,必须把二叉树的所有结点安排成为一个恰当的序列,结点在这个序列中的相互位置能反映出结点之间的逻辑关系,用编号的方法从树根起,自上层至下层,每层自左至右地给所有结点编号,缺点是有可能对存储空间造成极大的浪费,在最坏的情况下,一个深度为k且只有k个结点的右单支树需要2k-1个结点存储空间。依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映出结点之间的逻辑关系,这样既能够最大可能地节省存储空间,又可以利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系
图(a)是一棵完全二叉树,图(b)给出的图(a)所示的完全二叉树的顺序存储结构。

[img]http://dl.iteye.com/upload/attachment/0083/6391/64a6688c-5754-3ed7-9d05-2fda8bb6a426.png[/img]


对于一般的二叉树,如果仍按从上至下和从左到右的顺序将树中的结点顺序存储在一维数组中,则数组元素下标之间的关系不能够反映二叉树中结点之间的逻辑关系,只有增添一些并不存在的空结点,使之成为一棵完全二叉树的形式,然后再用一维数组顺序存储。如图1给出了一棵一般二叉树改造后的完全二叉树形态和其顺序存储状态示意图。显然,这种存储对于需增加许多空结点才能将一棵二叉树改造成为一棵完全二叉树的存储时,会造成空间的大量浪费,不宜用顺序存储结构。最坏的情况是右单支树,如图2所示,一棵深度为k的右单支树,只有k个结点,却需分配2k-1个存储单元。
图1:

[img]http://dl.iteye.com/upload/attachment/0083/6400/0aa91e2b-fc68-34b3-a7e2-4365390fdf23.png[/img]
图2

[img]http://dl.iteye.com/upload/attachment/0083/6404/48844a1c-3d35-3f5b-8e09-80d3f5dd7a84.png[/img]
2.链式存储结构

二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。

通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。其结点结构为:

Lchild|data|Rchild

其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表,这种结构只能从上至下查找

为了方便访问某结点的双亲,还可以给链表结点增加一个双亲字段parent,用来指向其双亲结点。每个结点由四个域组成,其结点结构为:
Lchild|data|Rchild|Parent
这种存储结构既便于查找孩子结点,又便于查找双亲结点;但是,相对于二叉链表存储结构而言,它增加了空间开销。利用这样的结点结构表示的二叉树的链式存储结构被称为三叉链表。

顺序存储(数组)和链表的优缺点:(可类比数组和链表)
数组:方便查找,节省存储空间(针对完全二叉树而言),查找方便,但是不方便改动
链表:改动方便,但是浪费存储空间,不方便查找遍历

你可能感兴趣的:(数据结构)