考研408 2014年第41题(二叉树带权路径长度【WPL】)

2024-03-09 13:36

本文主要是介绍考研408 2014年第41题(二叉树带权路径长度【WPL】),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

WPL=2×2+2×3+2×4+2×7=32

function.h(结构体):

//
// Created by legion on 2024/3/5.
//#ifndef INC_14_4_TREE_FUNCTION_H
#define INC_14_4_TREE_FUNCTION_H
#include <stdio.h>
#include <stdlib.h>typedef int BiElemType;
typedef struct BiTNode{BiElemType weight;//直接拿字符的ASCII值来计算即可struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;//tag结构体是辅助队列使用的 队列是由链表实现的
typedef struct tag{BiTree p;//树的某一个结点的地址值struct tag *pnext;
}tag_t,*ptag_t;//这个链表结构体类型tag_t 为什么和结构体名不一致//辅助队列 的结构体
typedef BiTree ElemType;
typedef struct LinkNode{ElemType data;//struct LinkNode *next;
}LinkNode;
typedef struct{//队列结构体LinkNode *front,*rear;//链表头 链表尾 可以称为队头 队尾
}LinkQueue;//先进先出void InitQueue(LinkQueue &Q);
//入队bool IsEmpty(LinkQueue Q);void EnQueue(LinkQueue &Q,ElemType x);//不修改故不引用
//出队
bool DeQueue(LinkQueue &Q,ElemType &x);//出队后有可能发生real指向头指针 Q有可能发生改变 所以引用#endif //INC_14_4_TREE_FUNCTION_H

queue.cpp(函数):

//
// Created by legion on 2024/3/7.
//
#include "function.h"//队列的初始化,使用的是带头结点的链表来实现的
void InitQueue(LinkQueue &Q)
{Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));Q.front->next==NULL;
}//判断队列是否为空
bool IsEmpty(LinkQueue Q)
{return Q.rear==Q.front;
}//入队
void EnQueue(LinkQueue &Q,ElemType x)//不修改故不引用
{LinkNode *pnew=(LinkNode*)malloc(sizeof(LinkNode));pnew->data=x;pnew->next=NULL;//要让next为NULLQ.rear->next=pnew;//尾指针的next指向pnew,因为从尾部入队Q.rear=pnew;//rear要指向新的尾部}//出队
bool DeQueue(LinkQueue &Q,ElemType &x)//出队后有可能发生real指向头指针 Q有可能发生改变 所以引用
{if(Q.rear==Q.front)//队列为空{return false;}LinkNode* q=Q.front->next;//拿到第一个结点,存入qx=q->data;Q.front->next=q->next;//让第一个结点断链if(Q.rear==q)//链表只剩余一个结点时,被删除后,要改变rear{Q.rear=Q.front;}free(q);return true;}

main.cpp:

#include "function.h"//int wpl=0;
//前序遍历函数,也叫先序遍历,也是深度优先遍历
int PreOrder(BiTree p,int deep)//只是遍历 即只是读,不会改变树根
{//这个p的类型是 树的结构体 不是之前的p指针static int wpl=0;//静态局部变量,存储在数据段内,所以只会初始化一次//while循环中只会走一次 ,区别于全局变量 只能在函数内访问,所以最后要return出去if(p!=NULL){
//        printf("ele%c--%d\n", p->c,deep);if(p->lchild==NULL&&p->rchild==NULL){wpl=wpl+p->weight*deep;}PreOrder(p->lchild,deep+1);//函数嵌套 打印左子树PreOrder(p->rchild,deep+1);//函数嵌套 打印右子树}return wpl;}
//中序遍历
void InOrder(BiTree p)//只是遍历 即只是读,不会改变树根
{//这个p的类型是 树的结构体 不是之前的p指针if(p!=NULL){InOrder(p->lchild);//函数嵌套 打印左子树printf("%c", p->weight);InOrder(p->rchild);//函数嵌套 打印右子树}
}
//后续遍历
void PostOrder(BiTree p)//只是遍历 即只是读,不会改变树根
{//这个p的类型是 树的结构体 不是之前的p指针if(p!=NULL){PostOrder(p->lchild);//函数嵌套 打印左子树PostOrder(p->rchild);//函数嵌套 打印右子树printf("%c", p->weight);}
}//层序遍历
//层次遍历 层序遍历 广度优先遍历
void LevelOrder(BiTree T)//树的结构体指针 有左孩子和有孩子
{LinkQueue Q;//定义一个队列QInitQueue(Q);//初始化队列Q 队头等于队尾  next指针指向NULLBiTree p;//存储出队的结点 p为一个树的结构体指针EnQueue(Q,T);//把根入队while(!IsEmpty(Q))//队列不为空才进入到循环当中{DeQueue(Q,p);putchar(p->weight);//等价于printf("%c",c);if(p->lchild){EnQueue(Q,p->lchild);//左孩子不为空 入队左孩子}if(p->rchild){EnQueue(Q,p->rchild);}}}int main() {BiTree pnew;//用来指向新申请的树结点 结构体指针类型BiTree tree=NULL;//tree是指向树根的,代表树char c;//定义队列 phead是队列头ptail是队列尾 listpnew指向新结点 pcur是指向当前父结点ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur;//输入abcdefghijwhile(scanf("%c",&c)){if(c=='\n'){break;//读取换行结束}//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0pnew= (BiTree)calloc(1,sizeof(BiTNode));pnew->weight=c;//数据放进去listpnew= (ptag_t)calloc(1,sizeof(tag_t));//给队列结点申请空间listpnew->p=pnew;if(NULL==tree)//如果树为空 放进去即为树根{tree=pnew;//树的根phead=listpnew;//队列头ptail=listpnew;//队列尾pcur=listpnew;continue;} else{ptail->pnext=listpnew;//新结点放入链表 通过尾插法ptail=listpnew;//ptail指向队列尾部}//pcur始终指向要插入的结点的位置if(NULL==pcur->p->lchild){pcur->p->lchild=pnew;//把新结点放到要插入结点的左边} else if(NULL==pcur->p->rchild){pcur->p->rchild=pnew;//把新结点放到要插入结点的右边pcur=pcur->pnext;//左右都放了结点后,pcur指向队列下一个}}//14.5二叉树的前序中序后续遍历printf("------------PreOrder------------\n");
//    printf("\n------------InOrder------------\n");
//    InOrder(tree);
//    printf("\n------------PostOrder------------\n");
//    PostOrder(tree);
//    printf("\n------------LevelOrder------------\n");
//    LevelOrder(tree);printf("wpl=%d\n",PreOrder(tree,0));//叶子结点层数为3时其实际路径为2return 0;
}

这篇关于考研408 2014年第41题(二叉树带权路径长度【WPL】)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/790827

相关文章

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

ZOJ Monthly, August 2014小记

最近太忙太忙,只能抽时间写几道简单题。不过我倒是明白要想水平提高不看题解是最好的了。 A  我只能死找规律了,无法证明 int a[50002][2] ;vector< vector<int> > gmax , gmin ;int main(){int n , i , j , k , cmax , cmin ;while(cin>>n){/* g

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin