树的遍历总结

22 篇文章 0 订阅

A1090 Highest Price in Supply Chain
  计算一棵树最深的叶子结点的个数。

思路:
  1、维持一个最大深度max_depth,初始化为一个很小的数字(正常情况不会达到),初始化最大深度叶子结点个数num=0。
  2、递归边界:当前结点index没有孩子,说明已经到达叶子结点。

vector<int> Node[maxn];
int num = 0, max_depth = -1;
void DFS(int index, int depth)
{
    if(Node[i].size() == 0)		//如果是叶子节点
    {
        if(depth > max_depth)	//深度比原来的最大深度大
        {
            max_depth = depth;	//更新最大深度
            num = 1;			//num置为1
        }
        else if(depth == max_depth)	//深度跟原来的最大深度一样大
        {
            num++;				//num++
        }
        return;
    }
    for(int i = 0; i < Node[index].size(); i++)		//递归访问index的子结点
        DFS(Node[index][i], depth + 1);
}

A1079 Total Sales of Supply Chain
  求最大价格,实际上还是求叶子结点所在的层数,不过增加了货物量(点权)的设定;
price = p * (1 + r)^depth(根结点为0,根结点深度为0)

struct node
{
    vector<int> child;	//子结点
    double data;		//货物量
}Node[maxn];

void DFS(int index, int depth)
{
    int ans = 0;
    if(Node[index].child.size() == 0)		//叶子结点
    {
        ans += Node[index].data * pow(1 + r, depth);
        return;
    }
    for(int i = 0; i < Node[index].child.size(); i++)		//递归访问子结点
        DFS(Node[index].child[i], depth + 1);
}

A1094 The Largest Generation
  求树中结点个数最多的一层,根结点为1,层号为1。
思路:
  定义一个hashtable数组,hashtable[i] = j 表示第 i 层有 j 个结点。进入函数时,hashtable[level] + 1,表示第 level 层的结点个数加1,之后遍历 index 的所有子结点。
最后遍历 hashtable 求最大值即可。

vector<int> Node[maxn];
int hashtable[maxn] = {0};	//每一层结点的个数
void DFS(int index, int level)
{
    hashtable[level]++;
    for(int i = 0; i < Node[index].size(); i++)
        DFS(Node[index][i], level + 1);
}

A1106 Lowest Price in Supply Chain
  求最低的价格(即最浅的叶子节点)
  注意:根结点为0,根结点深度为0

const int maxn = 100010;
const int INF = 0x7fffff;       //一个很大的数
vector<int> Node[maxn];
int num = 0;	//最浅叶子结点的个数
minPrice = INF;		//最小价格
void DFS(int index, int depth)
{
    if(Node[i].size() == 0)
    {
        double price = p * pow(1 + r, depth));
        if(price < minPrice)
        {
            minPrice = price;
            num = 1;
        }
        else if(price == minPrice)
        {
            num++;
        }
        return;
    }
    for(int i = 0; i < Node[index].size(); i++)
        DFS(Node[index][i], depth + 1);
}

A1004 Counting Leaves
    求每一层有多少叶子结点
    思路:开一个数组leaf表示每一层叶子结点的个数,max_h记录数的深度,方便后续输出函数体中先要更新max_h,再判断当前结点是否为叶子结点。

const int maxn = 100010;
vector<int> Node[maxn];
int max_h = 1;          //树的深度
int leaf[maxn] = {0};   //每一层叶子节点个数
void DFS(int index, int h)
{
    max_h = max(max_h, h);      //先更新深度
    if(Node[index].size() == 0)
    {
        leaf[h]++;
        return;
    }
    for(int i = 0; i < Node[index].size(); i++)
    {
        DFS(Node[index][i], h + 1);
    }
}

//输出每一层叶子结点个数。
for(int i = 1; i <= max_h; i++)
	printf("%d", leaf[i]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值