第五章 树和二叉树

一、树:

基本术语:

根:根节点;叶子:终端结点;分支结点:度!=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;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值