我试图使用堆栈在二叉树中找到从根节点到叶节点的最大值。 我写了下面的代码,但它有一个错误。 <>
Stacks s;
s.push(root);
maxSum=currSum=0;
while(!s.isEmpty()) {
temp = s.top();
s.pop();
if( temp->left == null && temp->right == null ) {
currSum = currSum+temp->data;
if(currSum > maxSum) {
maxSum = currSum;
}
currSum =0;
} else {
currSum = currSum + temp->data;
if(temp->left) s.push(temp->left);
if(temp->right) s.push(temp->right);
}
}
我要做的是计算叶子节点之前的总和并将其分配给maxSum 例如: - 二叉树是
1
/ \
2 3
/ \
4 5
1)我先按1并弹出。 currSum = 1;
2)按3和2并弹出2. cursum = 3并按5和4;
3)堆叠现在看起来像4< -5-< 3< 1(4是顶部元素)
4)现在4是叶节点,我输入if loop
并添加currSum = 3 + 4 = 7并弹出4。
5)现在temp是5,我设置currSum = 0,所以当我弹出5时currSum变为5。
任何人都可以帮我解决这个问题吗
答案 0 :(得分:2)
10
/ \
8 2
请考虑您的代码示例。
这是一个错误,因为我们正在失去根值。
以下代码将帮助您完成。尝试使用堆栈代替矢量。
使用namespace std;
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* createNode(int k) {
struct node* temp = new node;
temp->left = NULL;
temp->right = NULL;
temp->data = k;
return temp;
}
int tsum(vector<struct node *> path) {
int sum;
int n = path.size();
int i;
for (i = 0; i < n; i++)
sum = sum + path[i]->data;
return sum;
}
int maxsum(struct node *root) {
int currsum = 0, maxsum = 0;
vector<struct node *> v;
v.push_back(root); //Push root
vector<int> visited(100, 0);
while (v.size() > 0) {
visited[v.back()->data] = 1; //whenever node is reached mark visited
if (v.back()->left != NULL && !visited[v.back()->left->data])
v.push_back(v.back()->left);
else if (v.back()->right != NULL && !visited[v.back()->right->data])
v.push_back(v.back()->right);
else {
if (!v.back()->left && !v.back()->right) {
currsum = tsum(v);
if (currsum > maxsum)
maxsum = currsum;
}
v.pop_back(); //pop here is used for backtracking
}
}
return maxsum;
}
int main() {
int sum = 0;
std::vector<int> arr;
/* Constructed binary node is
1
/ \
2 3
/ \
4 5
*/
struct node *root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
int s = 0;
s = maxsum(root);
cout << "SUM" << s << "\n";
return 0;
}