第五章 樹和二叉樹

一、樹:

基本術語:

根:根節點;葉子:終端結點;分支結點:度!=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),空間效率On

//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;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章