数据结构C++ 二叉树——二叉树的应用

信号放大器问题的 结构 booster 在 booster.h 中定义:

 1 #pragma once
 2 #include <iostream>
 3 
 4 using namespace std;
 5 
 6 struct booster
 7 {
 8     int degradeToLeaf;            //到达子节点的信号衰减量
 9     int degradeFromParent;       //父节点到此的信号衰减量
10     bool boosterHere;            // 放置了信号放大器,值为真
11 
12     void output(ostream& out) const
13     {out << boosterHere << ' ' << degradeToLeaf << ' ' << degradeFromParent << ' ';}
14 };
15 
16 // overload <<
17 ostream& operator<<(ostream& out, booster x)
18     {x.output(out); return out;}

并查集问题所需的结构 unionFindNode 定义在 unionFindNode.h 中:

 1 #pragma once
 2 using namespace std;
 3 
 4 
 5 struct unionFindNode
 6 {
 7     int parent;  // root 为真时,表示树的重量;为假时表示父节点的指针
 8     bool root;   // 为根时,值为真
 9 
10     unionFindNode()
11     {
12         parent = 1; root = true;
13     }
14 };

application.h :

 1 #pragma once
 2 #include "booster.h"
 3 #include "binaryTreeNode.h"
 4 #include "linkBinaryTree.h"
 5 #include "unionFindNode.h"
 6 
 7 
 8 //信号放大器
 9 void placeBoosters(binaryTreeNode<booster> *x, int tolerance);
10 
11 //并查集
12 void initialize(int numberOfElements);
13 int find(int theElement);
14 void unite(int rootA, int rootB);

application.cpp :

 1 #include <iostream>
 2 #include "application.h"
 3 
 4 using namespace std;
 5 
 6 
 7 /*************************************************************************************
 8 //                                        信号放大器
 9 *************************************************************************************/
10 //x,二叉树节点; tolerance,最大容忍衰减
11 void placeBoosters(binaryTreeNode<booster> *x, int tolerance)
12 {
13     x->element.degradeToLeaf = 0;  // x处衰减量初始化
14 
15     //计算x的左子树的衰减量,如果大于阈值,则放置信号放大器
16     binaryTreeNode<booster> *y = x->leftChild;
17     if (y != nullptr)
18     {
19         int degradation = y->element.degradeToLeaf + y->element.degradeFromParent;
20         if (degradation > tolerance)    //衰减大于阈值,放置信号放大器
21         {
22             y->element.boosterHere = true;
23             x->element.degradeToLeaf = y->element.degradeFromParent;
24         }
25         else
26             x->element.degradeToLeaf = degradation;
27     }
28 
29     //计算x的右子树的衰减量,如果大于阈值,则放置信号放大器
30     y = x->rightChild;
31     if (y != nullptr)
32     {
33         int degradation = y->element.degradeToLeaf + y->element.degradeFromParent;
34         if (degradation > tolerance)    //衰减大于阈值,放置信号放大器
35         {
36             y->element.boosterHere = true;
37             degradation = y->element.degradeFromParent;
38         }
39         else
40             x->element.degradeToLeaf = degradation;
41     }
42 }
43 
44 
45 /*************************************************************************************
46 //                                        并查集
47 *************************************************************************************/
48 int *parent;
49 void initialize(int numberOfElements)    //初始化 numberOfElements 棵树
50 {
51     parent = new int[numberOfElements + 1];
52     for (int e = 1; e <= numberOfElements; e++)
53         parent[e] = 0;
54 }
55 
56 int find(int theElement)            //查找,返回 theElement 所在的树的根
57 {
58     while (parent[theElement] != 0)
59         theElement = parent[theElement];    //向上移动一层
60     return theElement;
61 }
62 
63 void unite(int rootA, int rootB)    //合并
64 {
65     parent[rootB] = rootA;
66 }

 

转载于:https://www.cnblogs.com/peformer/p/8058583.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值