在二叉树中找到累加和为指定值的最长路径长度

来源:互联网 发布:堆量选股公式 源码 编辑:程序博客网 时间:2024/06/05 06:45

给定二叉树头结点和sum,打印等于sum的最长路径长度


输入:

{-3,3,-9,1,0,2,1,0,0,1,6,0,0}

6

输出:

4




////  main.cpp//  在二叉树中找到累加和为指定值的最长路径长度////  Created by zjl on 16/9/14.//  Copyright © 2016年 zjl. All rights reserved.// 一条符合指定值的路径可以从任何节点开始,同时也可以跳过某些路径上的节点#include <iostream>#include <vector>#include <queue>#include <map>using namespace std;struct TreeNode{    int val;    TreeNode* left;    TreeNode* right;    TreeNode(int x):val(x),left(NULL),right(NULL){}};//初始化是层次遍历的初始化过程TreeNode* create(vector<int>vec){    int num = vec.size();    TreeNode* root = new TreeNode(vec[0]);    queue<TreeNode*> q;    q.push(root);    int i = 1;    while(i <= num){        TreeNode* t = q.front();        q.pop();        if(vec[i] > 0){            t->left = new TreeNode(vec[i]);            q.push(t->left);        }        else            t->left = NULL;        i++;        if(i<= num){            if(vec[i] > 0){                t->right = new TreeNode(vec[i]);                q.push(t->right);            }            else                t->right = NULL;            i++;                    }    }    return root;}int preorder(TreeNode* root, int sum, int presum, int level, int maxlen, map<int, int>&mp){    if(root == NULL)        return maxlen;    int cursum = presum + root->val;    if(mp.find(cursum) == mp.end())        mp[cursum] = level;    if(mp.find(cursum - sum) != mp.end())        maxlen = max(maxlen, level - mp[cursum-sum]);    maxlen = preorder(root->left, sum, cursum, level+1, maxlen, mp);    maxlen = preorder(root->right, sum, cursum, level+1, maxlen, mp);    if(level == mp[cursum])        mp.erase(cursum);    return maxlen;}int solve(TreeNode* root, int sum){    map<int, int>mp;    mp[0] = 0;  //记录目前的路径总和,对应的层数    return preorder(root, sum, 0, 1, 0, mp);}int main(int argc, const char * argv[]) {    // insert code here...    vector<int>num={-3,3,-9,1,0,2,1,0,0,1,6,0,0};//这里,0->NULL    TreeNode* root = create(num);    int sum = 6; //指定值    int res = solve(root, sum);    cout<< res<<endl;    return 0;}


0 0
原创粉丝点击