Advertisement

求二叉树的带权路径WPL

阅读量:

求二叉树的带权路径WPL,WPL是二叉树所有叶节点与深度乘积之和
代码:

复制代码
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    typedef struct BTNode{
    	int data;
    	struct BTNode *lchild,*rchild;
    }BTNode;
    //二叉树样式 
    //      6
    //   3     8
    //2    4  7   9
    //创建二叉树 
    bool Create(BTNode *&T, char x){
    	if(T==NULL){
    		T = (BTNode*)malloc(sizeof(BTNode));
    	T->data = x;
    		T->lchild=T->rchild=NULL;//生成结点
    	return true;
    	}
    	if(x<T->data)
    	Create(T->lchild,x);//构造左子树
    	else
    		Create(T->rchild,x);//构造右子树 
    }
    //先序遍历二叉树
    void preOrder(BTNode *p){
    	if(p!=NULL){
    		cout<<p->data;
    		preOrder(p->lchild);
    		preOrder(p->rchild);
    	}
    }
    //求带权路径 WPL(二叉树所有叶节点与深度乘积之和) 
    int wpl(BTNode *p,int i){
    	static int w=0;//静态代码块,在程序执行之前就已经创建,并在程序执行期间一直存在
    //而不是每次在代码块开始执行时创建,在代码块执行完毕后会自动销毁,所以还是局部变量 
    	if(p!=NULL){
    		if(p->lchild==NULL&&p->rchild==NULL)
    			w+=p->data*i;
    		wpl(p->lchild,i+1);
    		wpl(p->rchild,i+1);	
    	}
    	return w;
    }
    int main()
    {
    	int a[]={6,3,8,2,4,7,9};
    	struct BTNode *p=NULL;
    	for(int i = 0;i<7;i++)
    		Create(p,a[i]);
    	cout<<"先序遍历:";
    	preOrder(p);
    	cout<<endl<<"二叉树WPL:"<<wpl(p,1);
    }

测试结果:

在这里插入图片描述

全部评论 (0)

还没有任何评论哟~