考研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

相关文章

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

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

POJ1988带权并查集

M u v 将u所在的堆移动到v所在的堆的上面 C u 求u的下面有多少块 带权并查集 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;i

POJ1703带权并查集

D: u v  u与v在不同的集合 A: u v  查询u与v的关系 1)压缩路径过程        fu->root   0  1  u-fu 0                 0  1   1                 1  0 2)合并过程 fu->fv      u->fu   0 1   v->fv 0            1 0 1            0

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop