一、树:
基本术语:
根:根节点;叶子:终端结点;分支结点:度!=0(内部结点);
森林:m棵不相交树的集合
有序树:结点各子树从左至右有序,不能互换(左为一)
无序树:可以互换
双亲:直接前驱;孩子:直接后继
祖先:从根到该结点所经分支的所有结点;子孙:该结点下层子树的任意结点
兄弟:同一双亲下的同层结点;堂兄弟:双亲位于同一层,非同双亲
结点:树的数据元素
结点的度:结点挂接的子树数
结点的层次:从根到该结点的层数
树的度:所有结点度的最大值
树的层次:所有结点中最大的层数
二、二叉树
满二叉树:深度为k,且有2^k-1个结点
完全二叉树:前n-1层是满的,最后一层可以在右边缺少
二叉树的顺序存储:浪费空间,常适用于满二叉树和完全二叉树
二叉树链式存储常用,
//1.二叉链表
typedef struct BiNode
{
TElemTypedata;
structBiNode *lchild,*rchild;
}BiNode,*BiTree;
//2、三叉链表
typedef struct TriNode
{
TElemTypedata;
structBiNode *lchild,*rchild,*parent;
}TriNode,*TriTree;
//3.遍历二叉树
//先序遍历
void PreOrderTraverse(BiTree T)
{
if(T)
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
时间效率O(n),空间效率O(n)
//4.二叉树的建立
void CreateBiTree(BiTree &T)
{
char ch;
cin>>ch;
if(ch=='#')
T=NULL;
else
{
T=new BiNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//5.计算二叉树节点总数
int NodeCount(BiTree T)
{
if(T==NULL)
return 0;
else
return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
//6.计算二叉树叶子结点总数
int LeafNodeCount(BiTree T)
{
if(T==NULL)
return 0;
else if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return LeafNodeCount(T->lchild)+LeafNodeCount(T->rchild);
}
线索化二叉树
霍夫曼树
概率大的字符用短码,小的用长码
//构造霍夫曼树
typedef struct
{
intweight;
intparent,lch,rch;
}*HuffmanTree;