一、樹:
基本術語:
根:根節點;葉子:終端結點;分支結點:度!=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;