数据结构:树和二叉树

一、树的定义和基本术语

  • 把数据元素称为结点
  • 树是n(n>=0)个结点的有限集合。n=0时称为空树。
  • 有且仅有一个根节点。n>1时,除了根结点之外的其余结点被分成m棵互不相交的子树。
  • 结点的度:某结点拥有的子树的个数。
  • 树的度:每个结点的度的最大值

树的存储结构

双亲表示法

用一维数组来存储这棵树。每个结点元素存了自己的数据信息和双亲结点的下标。

孩子表示法

是一种基于链表的存储方法。有:

  1. 多重链表表示法
    就是一个节点元素有一个数据域,存自己的信息;还有好几个指针域,指向他们的孩子
  2. 孩子链表表示法
    每个结点的孩子们给弄成一个链表,n个结点就有n个链表。这个是孩子链表。
    然后还有表头,就是那n个结点。表头有数据域和firstchild指针指向第一个结点

双亲孩子表示法

将孩子链表表示法和双亲孩子表示法相结合。在孩子链表表示法的基础上,再增添一个数据元素用来存储双亲的下标。

孩子兄弟表示法

一个结点中,一个数据域,一个指针域存第一个孩子,一个指针域存右兄弟。

二叉树的逻辑结构

1.定义

  • 二叉树的每个结点最多有两棵子树
  • 二叉树是有序的
  • 满二叉树:叶子(度为0)只能出现在最下一层、只有度为0和度为2的结点
  • 完全二叉树:叶子结点只能出现在最下两层、最下层的叶子结点都集中在二叉树的左侧;如果有度为1的结点,只能有一个,且该结点只有左孩子。(请查找一个图来看)

2.二叉树的基本性质

1. 二叉树的第i层上最多有2
^i-1 个结点(1,2,4,8...)

2. 在一棵深度为k的二叉树中,最多有2^k -1 个结点,最少有k个结点。(1+2+4+8...)
3. 在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数为n2,则:n0 = n2 + 1
4. 具有n个结点的完全二叉树的深度为log2 n (向下取整) + 1
5. 对一棵具有n个结点的完全二叉树中的结点,从1开始按层序编号,则对于任意编号i(1<=i<=n)的结点,有:
如果结点i有左孩子,左孩子为2i;如果结点i有右孩子,右孩子为2i+1;如果结点i有双亲,那么双亲编号为i/2(向下取整)。

3.二叉树的遍历操作

前序、中序、后序、层序

二叉树的存储结构及实现

1.顺序存储结构。

把二叉树当成一颗完全二叉树来编号,这样可以从下反映出父子关系。但是这样浪费空间。

2.二叉链表

一个结点中,有一个数据域,一个指针域指向左孩子,一个指针域指向右孩子。

template<class D>
struct BiNode
{
    D data;//数据
    BiNode<D> *lchild,*rchild;
};
posted @ 2019-11-18 09:35  橘子橘子橘  阅读(409)  评论(0编辑  收藏  举报