#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(); //左右子樹訪問完成后根節(jié)點的和出棧
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;
}
完全二叉樹遍歷,并求解分支最大和
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
相關閱讀更多精彩內容
- 樹 在計算機科學中,樹(英語:tree)是一種抽象數(shù)據類型或是實現(xiàn)這種抽象數(shù)據類型的數(shù)據結構,用來模擬具有樹狀結構...
- 完全二叉樹舉例: 一、廣度優(yōu)先遍歷:對每一層節(jié)點依次訪問,訪問完一層進入下一層,而且每個節(jié)點只能訪問一次。對于例子...
- 1、概念 搜索二叉樹(Binary Search Tree - BST) 它的左子樹不空,則左子樹上所有結點的值均...
- 1.首先我們了解什么是完全二叉樹 完全二叉樹: 葉子節(jié)點只會出現(xiàn)最后2層,且最后1層的葉子節(jié)點都靠左對齊。 2.這...