zoukankan      html  css  js  c++  java
  • 【LeetCode】129. Sum Root to Leaf Numbers (2 solutions)

    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.

    每到达一个根节点,就代表一个路径访问完成,将和加入总和。

    解法一:

    树结构用递归是最容易的,每递归一层,上层的部分和需要乘以10在做加法。

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int sumNumbers(TreeNode *root) {
            int Sum = 0;
            Helper(root, 0, Sum);
            return Sum;
        }
        void Helper(TreeNode* root, int partSum, int& Sum)
        {
            if(root == NULL)
                return;
            else if(root->left == NULL && root->right == NULL)  //add this path
                Sum += (10*partSum+root->val);
            else
            {
                Helper(root->left, 10*partSum+root->val, Sum);
                Helper(root->right, 10*partSum+root->val, Sum);
            }
        }
    };

    解法二:

    非递归方法,使用栈存放当前的路径进行深度搜索,并设置部分和记录栈中的数值。

    结合进栈与出栈进行部分和调整:

    进栈:部分和*10+当前值

    出栈:(部分和-当前值)/10

    如果遍历到叶节点,则将部分和加入总和。

    /**
     * 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:
        int sumNumbers(TreeNode* root) {
            if(root == NULL)
                return 0;
            int ret = 0;
            int cur = 0;
            stack<TreeNode*> stk;
            unordered_map<TreeNode*, bool> visited;
            stk.push(root);
            visited[root] = true;
            cur += root->val;
            while(!stk.empty())
            {
                TreeNode* top = stk.top();
                if(top->left != NULL && visited[top->left] == false)
                {
                    stk.push(top->left);
                    visited[top->left] = true;
                    cur = cur*10 + top->left->val;
                    continue;
                }
                if(top->right != NULL && visited[top->right] == false)
                {
                    stk.push(top->right);
                    visited[top->right] = true;
                    cur = cur*10 + top->right->val;
                    continue;
                }
                if(top->left == NULL && top->right == NULL)
                {
                    ret += cur;
                }
                stk.pop();
                cur = (cur - top->val) / 10;
            }
            return ret;
        }
    };

  • 相关阅读:
    Linux网络编程一站式学习
    quick-cocos2d-x教程8:程序框架内lib文件夹分析
    petshop4.0 具体解释之中的一个(系统架构设计)
    LNK快捷方式漏洞利用方式 exp制作教程
    Serializable 作用
    0 1背包模板
    跟着辛星认识一下PHP的自己主动载入
    海茶3 らぶデス3 入门经典教程
    win下vm10+mac os 10.9安装遇到问题
    enum 在c中的使用
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4122506.html
Copyright © 2011-2022 走看看