码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode[129]-Sum Root to Leaf Numbers

时间:2017-07-13 20:21:31      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:div   nodevalue   addclass   https   javascrip   efi   tor   new   i++   

Link: https://leetcode.com/problems/sum-root-to-leaf-numbers/

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

For example,

    1
   /   2   3

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.


这道题让我真的醉了,先说下思路吧。

先求出每一个叶子节点的值,然后将这些值相加。

求叶子节点的值能够通过深度优先遍历。一遍往下,一遍添加各个节点的值。假设是叶子节点就将数组值的和添加到一个仅仅有叶子节点的数组中,最后求这个仅仅有叶子节点的数组的值得和。

从头到尾自己写的代码,能够AC了,还没有进行优化,先做到这里吧。

代码(C++):

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //return sum of newleafValue
    int sumNumbers(TreeNode* root) {
        if(root == NULL) return 0;
        if(!root->left && !root->right) return root->val;

        vector<int> nums = saveLeafNums(root);
        return sumV(nums);
    }
    //save leftnode to vector
    vector<int> saveLeafNums(TreeNode * root){

        vector<int> nums,nodeValue;
        int eachSum = 0;
        stack<TreeNode *> stk;
        map<TreeNode *, int> visited;

        TreeNode *p = root;

        stk.push(p);
        visited[p] = 0;
        nodeValue.push_back(p->val);

        while(!stk.empty()){
            while(p->left && visited[p]==0 ){
                //if this node is visited,break 
                if(visited[p->left]==1) break;
                p = p->left;
                stk.push(p);
                visited[p] = 0;
                tenMutilVector(nodeValue);//enlarge vector element‘s value
                nodeValue.push_back(p->val);
            }
            if(!stk.empty()) {
                p = stk.top();
                if(!p->left && !p->right){
                    nums.push_back(sumV(nodeValue));
                }
                if(p->right && (visited.find(p->right)==visited.end() || visited[p->right]==0)){
                    p = p->right;
                    stk.push(p);
                    visited[p] = 0;
                    tenMutilVector(nodeValue);
                    nodeValue.push_back(p->val);
                    continue;
                }
                visited[p] = 1;
                stk.pop();
                tenDivideVector(nodeValue);
                nodeValue.resize(nodeValue.size()-1);
            }
        }
        return nums;
    }

    void tenMutilVector(vector<int> &nums) {
        int n = nums.size();
        for(int i = 0; i < n; i++){
            nums[i] *= 10;
        }
    }

    void tenDivideVector(vector<int> &nums) {
        int n = nums.size();
        for(int i = 0; i < n; i++){
            nums[i] /= 10;
        }
    }

    int sumV(vector<int> &nums){
        int n = nums.size();
        int sumValue = 0;
        for(int i = 0; i < n; i++){
            sumValue += nums[i];
        }
        return sumValue;
    }   
};

附加一个求深度的代码:

    int getDepth(TreeNode* root) {
        if(root == NULL) return 0;

        int ldepth = 0,rdepth = 0;

        ldepth = getDepth(root->left);
        rdepth = getDepth(root->right);

        return ldepth>rdepth?ldepth+1:rdepth+1;
    }

方法二:(递归法)

class Solution {
public:
    int sumNumbers(TreeNode* root) {
        sum = 0;
        sumStep(root, 0);
        return sum;
    }
private:
    int sum;
    void sumStep(TreeNode *root, int num){
        if(!root) return;
        if(!root->left && !root->right) {
            sum = sum + num*10 + root->val;
        }else{
            sumStep(root->left, num*10 + root->val);
            sumStep(root->right, num*10 + root->val);
        }

    }
};

Leetcode[129]-Sum Root to Leaf Numbers

标签:div   nodevalue   addclass   https   javascrip   efi   tor   new   i++   

原文地址:http://www.cnblogs.com/mthoutai/p/7162121.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!