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

这篇博客介绍了如何计算二叉树的带权路径和(WPL),包括通过前序和中序序列创建二叉树、层序遍历打印二叉树以及使用深度优先搜索(DFS)计算WPL。文章详细阐述了递归创建二叉树的过程,并给出了完整代码,特别提醒在创建树时要注意判断前序序列的范围。
摘要由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 i = 0;i < h 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值