数据结构——树

图片来源:https://www.cnblogs.com/willwu/p/6007555.html

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

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

树这种数据结构的用途:
例如:家族的族谱图、公司的组织结构图、书的目录等。
数据结构——树_第1张图片

1。二叉树

二叉树是一种特殊的树。二叉树的特点是每个结点最多有两个儿子。
二叉树使用范围最广。一颗多叉树也可以转化为二叉树。
这里写图片描述
1)满二叉树:二叉树中每个内部节点都有两个儿子。满二叉树所有的叶节点都有相同的深度。
满二叉树是一棵深度为h且有 2h1 2 h − 1 个结点的二叉树。
这里写图片描述
2)完全二叉树:若设二叉树的高度为 h h ,除了第 h h 层外,其他层的结点数都达到最大个数,第h层从右向左连续 缺若干个结点,则为完全二叉树。
这里写图片描述

特点:
由上图发现:

1)如果一棵完全二叉树的父节点编号为 K K ,则其左儿子的编号是 2K 2 K ,右儿子的结点编号为 2K+1 2 K + 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个结点,那么这棵二叉树的深度为【 log2N+1 l o g 2 ( N + 1 ) 】(向上取整)
完全二叉树最典型的应用就是堆。

二叉树的遍历方式:
数据结构——树_第2张图片


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

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

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

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

(以下图片及数据来源于https://www.cnblogs.com/fthjane/p/4746186.html)
这里写图片描述
其中,data域存放某结点的数据信息;lchild与rchild分别存放指向左孩子和右孩子的指针,当左孩子或右孩子不存在时,相应指针域值为空(用符号∧或NULL表示)。利用这样的结点结构表示的二叉树的链式存储结构被称为二叉链表。
如下图2:
数据结构——树_第3张图片

三叉链表:
这里写图片描述
图2 二叉树的三叉链表表示示意图:
数据结构——树_第4张图片


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

结构2二叉树的链式存储

#define datatype char  //定义二叉树元素的数据类型为字符
typedef struct  node   //定义结点由数据域,左右指针组成
{ Datatype data;
  struct node *lchild,*rchild;
 }Bitree;

你可能感兴趣的:(《剑指offer》,C++,二叉树,C++数据结构)