41.(13分)二叉树的带权路径长度(WPL)是二叉树中所有叶结点的
2021.07.20 07:15

  【题目】

  41.(13分)二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T,采用二叉链表存储,结点结构为:,其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针,请设计求T的WPL的算法。要求:

  (1)给出算法的基本设计思想;

  (2)使用C或C++语言,给出二叉树结点的数据类型定义;

  (3)根据设计思想,采用C或C++语言描述算法,关键之处给出注释。

  【答案参考】:

  【答案一】

  (1)算法的设计思想:

  本问题可采用递归算法实现。根据定义:

  二叉树的WPL值=树中全部叶结点的带权路径长度之和

                          =根结点左子树中全部叶结点的带权路径长度之和+根结点右子树中全部叶结点的带权路

                          径长度之和

  叶结点的带权路径长度=该结点的weight域的值×该结点的深度

  设根结点的深度为0,若某结点的深度为d时,则其孩子结点的深度为d+1。

  (2)算法中使用的二叉树结点的数据类型定义如下:

  typedef struct node

  {

  int weight:

  struct node * left,* right;

  } BTree;

  (3)算法实现:

  int WPL(BTree * root) //根据WPL的定义采用递归算法实现

  { return WPL1(root,0);

  }

  int WPLl (BTree * root,int d) //d为结点深度

  { if(root->left==NULL && root->right==NULL)

  return(root->weight * d);

  else

  return(WPL1(root->left,d+1)+WPLl (root->right,d+1));

  }

  【答案二】

  (1)算法的设计思想:

  若借用非叶结点的weight域保存其孩子结点中weight域值的和,则树的WPL等于树中所有非叶结点weight域值之和。

  采用后序遍历策略,在遍历二叉树T时递归计算每个非叶结点的weight域的值,则树T的WPL等于根结点左子树的WPL加上右子树的WPL,再加上根结点中weight域的值。

  (2)算法中使用的二叉树结点的数据类型定义同【答案一】。

  (3)算法实现:

  int WPL(BTree*root) //基于递归的后序遍历算法实现

  { int w_l,w_r;

  if(root->left==NULL && root->right==NULL)

  return 0:

  else

  { w_l=WPL(root->left); //计算左子树的WPL

  w_r=WPL(root->right); //计算右子树的WPL

  root->weight=root->left->weight + root->right->weight;//填写非叶结点的weight域

  return(w_l+w_r + root->weight);//返回WPL值

  }

  }


MORE+

    相关阅读 MORE+

    版权及免责声明
    1.凡本网注明"稿件来源:新东方在线"的所有文字、图片和音视频稿件,版权均属北京新东方迅程网络科技有限公司所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本网协议授权的媒体、网站,在下载使用时必须注明"稿件来源:新东方在线",违者本网将依法追究责任。
    2.本网末注明"稿件来源:新东方在线"的文/图等稿件均为转载稿,本网转载出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如其他媒体、网站或个人从本网下载使用,必须保留本网注明的"稿件来源",并自负版权等法律责任。如擅自篡改为"稿件来源:新东方在线”,本网将依法追究责任。
    3.如本网转载稿涉及版权等问题,请作者致信weisen@xdfzx.com,我们将及时外理

    Copyright © 2011-202

    All Rights Reserved