一、树概述
1.树定义
树是个结点构成的有限集合。
1)当n=0时,称为空树;
2) 对于任一棵非空树都有一个称为“根(Root)”的结点;其余结点可分为m(m>0)个互不相交的有限集,其中每个集合是原来树的子树。
子树是不相交的;除了根结点外,每个结点有且仅有一个父结点; 一棵N个结点的树有N-1条边。
2.树的一些基本概念
结点的度:结点的子树个数
树的度:树的所有结点中最大的度数
叶结点:度为0的结点
父结点:有子树的结点是其子树的根结点的父结点
子结点:若A结点是B结点的父结点,则称B结点是A结点的子结点;子结点也称孩子结点。
树的深度:树中所有结点中的最大层次是这棵树的深度。
3.表示方法
链表表示方法:
儿子兄弟表示:二叉树
二、二叉树
1.二叉树概念种类
二叉树:一个有穷的结点集合。这个集合可以为空;若不为空,则它是由根结点和称为其左子树TL和右子树TR的
两个不相交的二叉树组成。
二叉树的子树有左右顺序之分。
斜二叉树:只有左儿子或右儿子。
完美二叉树:
完全二叉树:有n个结点的二叉树,对树中结点按从上至下、从左到右顺序进行编号,编号为i(1 ≤ i ≤ n)结点与满二叉树中编号为 i 结点在二叉树中位置相同。
2.性质
1)一个二叉树第 i 层的最大结点数为:2 ^ i-1 ,i >=1。深度为k的二叉树有最大结点总数为: 2 ^ k-1,k >=1。
2)对任何非空二叉树,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0
= n2+1。
3.存储结构
非根结点(序号 i > 1)的父结点的序号是 i / 2;
结点(序号为 i )的左孩子结点的序号是 2i,(若2 i <= n,否则没有左孩子);
结点(序号为 i )的右孩子结点的序号是 2i+1,(若2 i +1<= n,否则没有右孩子);
链表存储方式:
template <class T>
struct BinTree
{
T Data;
BinTree *Left;
BinTree *Right;
};
4.基本操作
1)用数组初始化:
template <class T1, class T2>
BinTree<T1> *CreatTree(T2 a, size_t n, int index)
{
BinTree<T1> *root = nullptr;
if (index < n && a[index] != 0)
{
root = new BinTree<T1>;
root->Data = a[index];
root->Left = CreatTree<T1, T2>(a, n, ++index);
root->Right = CreatTree<T1, T2>(a, n, ++index);
}
return root;
cout << endl;
}
//数组初始化
int a[] = {