#include <iostream>
#include <map>
#include <vector>
#include <stack>
using namespace std;
//遍历二叉树每个分支求最大值
int sum = 0;
int MaxValue = 0;
/*
4
2 3 4 5
2 5 2 4
*/
stack<int> sums;
//完全二叉树的前序遍历并求解分支最大和路径
void PreTraverse(vector<int> tree, int index, int n)
{
if (index > n) //该分支如果访问完成
{
if (sum > MaxValue) //分支的和是否为最大
{
MaxValue = sum; //更新最大分支和
}
return;
}
//cout << tree[index] << " ";
sum += tree[index]; //计算每个分支的和
sums.push(sum); //分支和入栈
PreTraverse(tree, 2 * index, n); //左子树
PreTraverse(tree, 2 * index + 1, n); //右子树
sums.pop(); //左右子树访问完成后根节点的和出栈
if (!sums.empty())
{
sum = sums.top(); //上一个结点的和
}
}
int main(int argc, char** argv)
{
int n;
cin >> n;
int maxNode = 0;
vector<int> p;
vector<int> tree; //初始化一个完全二叉树
p.resize(n + 1); //p
for (int i = 1; i <= n; i++)
{
cin >> p[i];
if (p[i] > maxNode)
{
maxNode = p[i];
}
}
tree.resize(maxNode + 1); //最多有maxNode个结点,且每一个结点初始化为0
for (int i = 1; i <= n; i++)
{
cin >> tree[p[i]]; //构造完全二叉树
}
PreTraverse(tree, 1, maxNode);
cout << MaxValue << endl;
return 0;
}
完全二叉树遍历,并求解分支最大和
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 树 在计算机科学中,树(英语:tree)是一种抽象数据类型或是实现这种抽象数据类型的数据结构,用来模拟具有树状结构...
- 完全二叉树举例: 一、广度优先遍历:对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。对于例子...
- 1、概念 搜索二叉树(Binary Search Tree - BST) 它的左子树不空,则左子树上所有结点的值均...
- 1.首先我们了解什么是完全二叉树 完全二叉树: 叶子节点只会出现最后2层,且最后1层的叶子节点都靠左对齐。 2.这...