完全二叉樹遍歷,并求解分支最大和

#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ā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容