Advertisement

设计算法求二叉树的带权路径长度(WPL)

阅读量:

设计算法求二叉树的带权路径长度(WPL)

二叉树的带权路径长度(WPL)等于其所有终端节点到根节点的加权距离总和

队列的基本操作以严蔚敏编写的教材为准。

基于层次遍历的算法:

复制代码
    int WPL_LevelOrder (BiTree T)
    {
    	int L = 0; //L是当前层结点到根节点的路径长度,即所经过的边的个数
    	int WPL = 0; //WPL为二叉树的带权路径长度
    	BiTNode *p; //p为遍历指针
    	InitQueue(Q); //初始化队列
    	EnQueue(Q, T) //根节点入队
    	while (!QueueEmpty(Q)) //队不空则循环
    	{
    		for (int i = 0; i < QueueLength(Q); ++i) //循环遍历每一层的结点
    		{
    			DeQueue(Q, p); //队头结点出队
    			if (p->lchild == NULL && p->rchild == NULL) 
    				//若为叶结点,则累积WPL,p->weight为该结点的权值
    				WPL = WPL + p->weight * L;
    			if (p->lchild != NULL) //左子树不空则入队
    				EnQueue(Q, p->lchild);
    			if (p->rchild != NULL) //右子树不空则入队
    				EnQueue(Q, p->rchild);
    		}
    		L++; //路径长度加1
    	}
    	return WPL; //返回带权路径长度WPL
    }

基于先序递归遍历的算法实现:

复制代码
    int WPL(BiTree T)
    {
    	return WPL_PreOrder(T, 0);
    }
    
    int WPL_PreOrder(BiTree T, int deep)
    {
    	static int WPL = 0; //定义一个static变量存储WPL
    	if (T->lchild == NULL && T->rchild == NULL) //若为叶结点,则累积WPL
    		WPL += deep * T->weight;
    	if (T->lchild != NULL) //若左子树不空,则对左子树递归遍历
    		WPL_PreOrder(T->lchild, deep + 1);
    	if (T->rchild != NULL) //若右子树不空,则对右子树递归遍历
    		WPL_PreOrder(T->rchild, deep + 1);
    	return WPL; //返回带权路径长度WPL
    }

全部评论 (0)

还没有任何评论哟~