数据结构-树(上)
- 树的表示:(法1)结构+链表
*优点:结构统一,易于处理;
*缺点:结构的统一会造成空间上的浪费,比如3n个指针域,实际只需n-1个指针域;
- 树的表示:(法2)儿子-兄弟表示法(二叉树)
*形式:1个结点2个指针,分别指向第1个儿子和下1个兄弟;
*优点:结构统一,且空间浪费不大[为2n-(n-1)];
*二叉树在树的研究中是最重要且最主要的树;
- 二叉树的定义
typedef struct TNode *Position; typedef Position BinTree;/*二叉树类型*/ struct TNode /*树结点定义*/ { ElementType Data; /*结点数据*/ BinTree Left; /*指向左子树*/ BinTree Right; /*指向右子树*/ };
*度为2的树,且该树有左右之分;
*特殊的二叉树:
斜二叉树:左斜或右斜,一条直线的链;
完美二叉树(满二叉树):所有结点皆满;
完全二叉树:(类似于满二叉树)上至下,左至右编号,且允许不满,且必须从右边开始缺子树;
- 二叉树的重要性质:
*二叉树第i层的最大结点数:2^(i-1);
*深度为K的二叉树的最大结点总数(完美二叉树):[2^k]-1;
*n0:叶结点的个数,n1:度为1的非叶结点的个数,n2:度为2的非叶结点的个数,满足:n0=n2+1;
- 二叉树的操作集:
(1)判断BT是否为空;
(2)按顺序遍历;
*先序遍历:根、左子树、右子树
*中序遍历:左子树、根、右子树
*后序遍历:左子树、右子树、根
*层次遍历:从上到下、从左到右
(3)创建一个二叉树;
- 二叉树的存储结构:
(1)完全二叉树(从上到下、从左到右编号)【数组存储】:
*非根节点的父结点的序号为i/2往下取整;
*结点的左孩子:2i;(若2i<=n)
*结点的右孩子:2i+1;(若2i+1<=n)
(2)一般的二叉树
(可以采用上面这种顺序结构,但是会造成空间的浪费)【数组存储】
(链表存储一般二叉树,避免浪费空间)【链表存储】
hello world~