计算二叉树带权路径和(WPL)

前言二叉树的带权路径和,指的是二叉树的所有叶子节点的权值 * 其深度 之和。本次因为是完整的程序,所以包含1)输入前序、中序序列 创建二叉树2)层序遍历打印出二叉树3)计算WPL数据结构定义typedef struct Node* List;typedef struct Node{List l, r;int data;};创建二叉树1、变量说明int n; // n是二叉树的节点数vector preorder(9), inorder(9); //前序和..
摘要由CSDN通过智能技术生成
  • 前言
    二叉树的带权路径和,指的是二叉树的所有叶子节点的权值 * 其深度 之和。
    本次因为是完整的程序,所以包含
    1)输入前序、中序序列 创建二叉树
    2)层序遍历打印出二叉树
    3)计算WPL

  • 数据结构定义
    typedef struct Node* List;
    typedef struct Node{
    List l, r;
    int data;
    };

  • 创建二叉树
    1、变量说明
    int n; // n是二叉树的节点数
    vector preorder(9), inorder(9); //前序和中序
    List root = new Node(); //root
    unordered_map<int, int> mp;
    因为我们用前序和中序确定二叉树,思想是递归的(因为树是递归定义的),首先是通过前序,确定根部,然后再确定左子树和右子树节点数,以此递归。
    此无序map,便是用于将前序根部,在中序中确定位置。其key 是 权值;value是位置,也即下标。

    2、思路
    如上文所说,其创建是递归创建的。

List createTree(int pre_l, int pre_r, int in_l, int in_r){
   
    if (pre_l > pre_r) {
   
        return NULL;
    }
    // 定位根节点
    int pre_root = pre_l;
    int in_root = mp[preorder[pre_root]];

    List root = new Node();
    root->weight = preorder[pre_root];
    // cout<<"This root weight = "<<root->weight<<endl;

    int len_left = in_root - in_l;
    root->left = createTree(pre_l + 1, pre_l + len_left, in_l, in_root - 1);
    root->right = createTree(pre_l + 1 + len_left, pre_r, in_root + 1, in_r);
    return root;
}

如上代码所示,
在构建左子树时的四个参数如下图
在这里插入图片描述

在构建右子树时的四个参数如下图
在这里插入图片描述

如此递归创建便好。

  • 层序遍历打印
    一个简单的bfs即可。
void printT(List root){
   
    queue<List> q;
    q.push(root);
    int d = 0;
    while (!q.empty()) {
   
        List tmp = NULL;
        int num = q.size();
        for(int
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值