赞
踩
树(Tree)是 n ( n > = 0 ) n(n>=0) n(n>=0)个节点的有限集,在任意一颗非空树中:
(1) 有且仅有一个特定的称为根(Root)的节点,根节点是没有前驱节点的。
(2)当 n > 1 n > 1 n>1时,其余节点可以分为 m ( m > 0 ) m(m>0) m(m>0)个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树。
树和非树
树要满足以下几个条件
比如下面的两棵树就是非树
再来看一下一些比较重要的概念,通过下面这棵树来举例子
树结构相对于线性表来说就比较复杂,要存储表示起来就比较麻烦了,实际中由很多种表示方法,比如:双亲表示法、孩子表示法、孩子兄弟表示法等。其中最常用的就是孩子兄弟表示法。
typedef int DataType;
struct Node
{
struct Node* firstChild1; // 第一个孩子结点
struct Node* nextBrother; // 指向其下一个兄弟结点
DataType _data; // 结点中的数据域
};
二叉树(Binary Tree)是另一种树形结构,它的特点是每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。
下面几颗树都可以叫做二叉树
特殊的二叉树
顺序存储就是使用数组来存储,一般顺序存储只适用于完全二叉树,因为如果不是完全二叉树会存在空间的浪费。而实际情况中,只有堆才会使用数组来存储。二叉树的顺序存储在物理上是一个数组,而在逻辑上才是一棵二叉树
设计不同的节点结构可构成不同形式的链式存储结构。由二叉树的定义可知,二叉树的节点由一个数据元素分别指向其左右子树的两个分支构成,则表示二叉树的链表中的结点至少包含3个域:数据域和左右指针域,左右指针分别指向左右孩子所在的链节点的存储地址。
// 二叉树
struct BinaryTreeNode
{
struct BinTreeNode* pLeft; // 指向当前节点左孩子
struct BinTreeNode* pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。