二叉树中寻找节点和最大值的路径(C++ 实现)

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
 // rule in result vector during iteration:
 // single path: 0;   ----> v0
 // cross path: 1;    ----> v1
 // single point: 2;  ----> v2
 // lonely path: 3;   ----> v3
 
class Solution {
public:
    int maxPathSum(TreeNode *root) {
        vector *rv = mps(root);
        int r = miv(*rv);
        delete rv;
        return r;
    }
    
    vector *mps(TreeNode *root) {
        if(!root) return NULL;
        
        vector *ret = new vector;
        
        vector *lr = mps(root->left);
        vector *rr = mps(root->right);
        
        vector v0;
        v0.push_back(root->val);
        if(lr) v0.push_back(root->val + (*lr)[0]);
        if(rr) v0.push_back(root->val + (*rr)[0]);
        
        vector v1;
        if(lr) v1.push_back((*lr)[1]);
        if(rr) v1.push_back((*rr)[1]);
        if(lr && rr) v1.push_back((*lr)[0] + (*rr)[0] + root->val);
        
        vector v2;
        v2.push_back(root->val);
        if(lr) v2.push_back((*lr)[2]);
        if(rr) v2.push_back((*rr)[2]);
        
        vector v3;
        if(lr) {
            v3.push_back((*lr)[0]);
            v3.push_back((*lr)[3]);
        }
        if(rr) {
            v3.push_back((*rr)[0]);
            v3.push_back((*rr)[3]);
        } 
        
        ret->push_back(miv(v0));
        ret->push_back(miv(v1));
        ret->push_back(miv(v2));
        ret->push_back(miv(v3));
        
        delete lr;
        delete rr;
        
        return ret;
    }
    
    // max in vector
    int miv(vector l) {
        int m = INT_MIN;
        vector::const_iterator cit = l.begin();
        while(cit != l.end()) {
            m = *cit > m ? *cit : m;
            cit ++;
        }
        return m;
    }
};

 

你可能感兴趣的:(算法设计)