使用堆栈在二叉树中从根到叶的最大值总和

时间:2015-06-13 03:47:49

标签: binary-tree

我试图使用堆栈在二叉树中找到从根节点到叶节点的最大值。 我写了下面的代码,但它有一个错误。 <>

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。

任何人都可以帮我解决这个问题吗

1 个答案:

答案 0 :(得分:2)

    10
  /   \
 8     2

请考虑您的代码示例。

  1. 第一个根(10)被推入堆栈,我们立即弹出它。
  2. 现在,currsum变为10,左(8)和右(2)个节点被推入堆栈。
  3. 现在最顶层的元素(2)被弹出并添加到currsum.Now currsum变为12。
  4. 当我们到达叶节点时,maxsum包含currsum值。
  5. 并且currsum为0。
  6.   

    这是一个错误,因为我们正在失去根值。

    1. 现在我们弹出最后一个元素(8)并且currsum有值8.当我们到达叶节点时,我们与maxsum(12)进行比较,最终的答案是 12这是错误的。
    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;
      
      }