树
树是一些节点的集合,可以是空集也可以不是,树的最开始节点为根,其它的为儿子,一个节点可以有多个儿子也可以没有。
1、结点的度
树中的一个结点拥有的子树数称为该结点的度;一棵树的度是指该树中结点的最大度数。度为零的结点称为叶子(Leaf)或终端结点。度不为零的结点称分支结点或非
2、路径
若树中存在一个结点序列k1,k2,…,ki,使得ki是ki+1的双亲,则称该结点序列是从kl到kj的一条路径,路径的长度指路径所经过的边(即连接两个结点的线段)的数目。
3、节点的深度
结点的深度为根到节点路径的长,根的深度为1,其余结点的深度等于其双亲结点的深度加1。树中结点的最大深度称为树的高度(Height)或深度(Depth)。
二叉树
二叉树是一种比较特殊的数型结构,它的每个节点最多只能有两个子节点。如下图:
二叉树的存储:
这里只介绍二叉树的链式存储结构,其每个节点结构有一个数据,一个指向左子节点的指针和一个指向右子节点的指针;
具体如下图:
满二叉树
一棵深度为k且有2^k-1个结点的二又树称为满二叉树。
满二叉树的特点:
(1) 每一层上的结点数都达到最大值。即对给定的高度,它是具有最多结点数的二叉树。
(2) 满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层上。
完全二叉树
若一棵二叉树至多只有最下面的两层上结点的度数可以小于2,并且最下一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。
特点:
(1) 满二叉树是完全二叉树,完全二叉树不一定是满二叉树。
(2) 在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。
(3) 在完全二叉树中,若某个结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。
二叉树的遍历:
二叉树主要有三种遍历方式(由根节点遍历的顺序来决定是哪一种遍历方式,左节点始终在右节点之前):
1.中序遍历
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)访问根结点;
(3)遍历右子树。
2.先序遍历
若二叉树非空,则依次执行如下操作:
(1) 访问根结点;
(2) 遍历左子树;
(3)遍历右子树。
3.后序遍历
若二叉树非空,则依次执行如下操作:
(1)遍历左子树;
(2)遍历右子树;
(3)访问根结点。
下面通过程序实现二叉树的定义和相关一些运算:
有关二叉树的各种运算基本都利用了递归函数,队二叉树进行分层运算;
#include <stdio.h>
#include <stdlib.h>
#define DataType int
//二叉树结点构造
typedef struct node
{
DataType data;
struct node *lchild;
struct node *rchild;
}BinNode;
typedef BinNode *BinTree;
//二叉树遍历(先序)
void TreeTraversal1(BinTree T)
{
if(T)
{
printf("%d\t",T->data); // 输出节点值
TreeTraversal1(T->lchild); // 遍历左子节点
TreeTraversal1(T->rchild); //遍历右子节点
}
}
//二叉树遍历(中序)
void TreeTraversal2(BinTree T)
{
if(T)
{
TreeTraversal2(T->lchild);