数据结构——树

[亡魂溺海] 提交于 2020-02-27 22:43:34

数据结构——树

树其实就是不包含回路的连通无向图。

树的特性:
1)一棵树中的任意两个结点有且仅有唯一的一条路径连通;
2)一棵树如果有nn个结点,则它一定有n−1n−1条边;
3)在一棵树中加一条边将会构成一个回路。

树这种数据结构的用途:
例如:家族的族谱图、公司的组织结构图、书的目录等。
在这里插入图片描述

1. 二叉树

二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。
二叉树用范围最广。一颗多叉树也可以转化为二叉树。
在这里插入图片描述

1)满二叉树:二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。
满二叉树是一棵深度为h且有2h−12h−1个结点的二叉树。
在这里插入图片描述

2)完全二叉树:若设二叉树的高度为hh,除了第hh层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。

在这里插入图片描述

特点:
由上图发现:

1)如果一棵完全二叉树的父节点编号为KK,则其左儿子的编号是2K2K,右儿子的结点编号为2K+12K+1,

公式总结:
2)已知完全二叉树的总节点数为n求叶子节点个数:
当n为奇数时:(n+1)/2
当n为偶数时 : (n)/2

3)已知完全二叉树的总节点数为n求父节点个数:为:n/2

4)已知完全二叉树的总节点数为n求叶子节点为2的父节点个数:
当n为奇数时:n/2
当n为偶数时 : n/2-1

5)如果一棵完全二叉树有N个结点,那么这棵二叉树的深度为【log2(N+1)log2(N+1)】(向上取整)
完全二叉树最典型的应用就是堆。

二叉树的遍历方式:
在这里插入图片描述

2.堆——神奇的优先队列

堆是一种特殊的完全二叉树。

1)完全二叉树——数组存储表示(按照层次遍历的方式,结点编号为 ii 的结点的左子结点编号为 2∗i2∗i , 右子结点编号为 2∗i+12∗i+1. )
2)一般二叉树(尤其是形态剧烈变化的二叉树)——链表表示。
3)层次遍历的二叉树——队列。
4)前序遍历、中序遍历、后序遍历——可以用栈来实现。

二叉链表:二叉树的结点至少包含三个域,分别存放节点的数据data,左结点指针leftchild, 和 右结点指针rightchild.这种链表结构称为二叉链表。——缺点:难以找到父结点。
三叉链表: 比二叉链表多一个父指针域parent. 称为三叉链表。

在这里插入图片描述

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

在这里插入图片描述

三叉链表:

在这里插入图片描述

图2 二叉树的三叉链表表示示意图:
在这里插入图片描述

尽管在二叉链表中无法由结点直接找到其双亲,但由于二叉链表结构灵活,操作方便,对于一般情况的二叉树,甚至比顺序存储结构还节省空间。因此,二叉链表是最常用的二叉树存储方式。

结构2二叉树的链式存储

#define datatype char  //定义二叉树元素的数据类型为字符
typedef struct  node   //定义结点由数据域,左右指针组成
{ Datatype data;
  struct node *lchild,*rchild;
 }Bitree;
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!