C++ 中二叉树的最大螺旋和
在这个问题中,我们给定一个二叉树。我们的任务是创建一个程序,该程序将在 C++ 中找到二叉树中的最大螺旋和。
螺旋和二叉树是指在二叉树的螺旋遍历中遇到的节点的总和。
在树的螺旋遍历中,节点从根节点遍历到叶节点。遍历从左到右进行,然后对于下一层从右到左进行,依此类推,对于更深层级也是如此。
示例 -
输出 -5
说明 -
我们将考虑螺旋遍历,直到树的第 2 层的第一个节点。
1+ 5 = 5.
第三行的元素和 (1-9+6-4 = -6) 会降低总和,因此在考虑最大和时将其排除。
为了解决这个问题,我们将使用一个数组来存储每层元素的和,并且为了找到每层的螺旋和,我们将使用两个栈。然后在最后,我们将检查包含该层之后的和是否会增加最大和,如果是,那么我们将保留它,否则丢弃其余的螺旋。
示例
查找二叉树中最大螺旋和的程序
#include <bits/stdc++.h> using namespace std; struct Node { int data; Node *left, *right; }; Node* insertNode(int data){ Node* node = new Node; node->data = data; node->left = node->right = NULL; return node; } int findMaxSum(vector<int> arr, int n){ int sum = INT_MIN; int maxSum = INT_MIN; for (int i = 0; i < n; i++) { if (sum < 0) sum = arr[i]; else sum += arr[i]; maxSum = max(maxSum, sum); } return maxSum; } int SpiralSum(Node* root){ if (root == NULL) return 0; stack<Node*> sRtL; stack<Node*> sLtR; vector<int> arr; sRtL.push(root); while (!sRtL.empty() || !sLtR.empty()) { while (!sRtL.empty()) { Node* temp = sRtL.top(); sRtL.pop(); arr.push_back(temp->data); if (temp->right) sLtR.push(temp->right); if (temp->left) sLtR.push(temp->left); } while (!sLtR.empty()) { Node* temp = sLtR.top(); sLtR.pop(); arr.push_back(temp->data); if (temp->left) sRtL.push(temp->left); if (temp->right) sRtL.push(temp->right); } } return findMaxSum(arr, arr.size()); } int main(){ Node* root = insertNode(1); root->left = insertNode(5); root->right = insertNode(-1); root->left->left = insertNode(-4); root->left->right = insertNode(6); root->right->left = insertNode(-9); root->right->right = insertNode(1); cout << "Maximum Spiral Sum in binary tree : "<<SpiralSum(root); return 0; }
输出
Maximum Spiral Sum in binary tree : 6
广告