-
前言
二叉树的带权路径和,指的是二叉树的所有叶子节点的权值 * 其深度 之和。
本次因为是完整的程序,所以包含
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