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;
        }
    };

  • 相关阅读:
    《转》MFC六大关键技术之(五)(六)——消息映射与命令传递
    《转》MFC六大关键技术之(四)——永久保存(串行化)
    《转》MFC六大关键技术之(三)——动态创建
    《转》MFC六大关键技术之(二)——运行时类信息(RTTI)
    《转》MFC六大关键技术之(一)—— 初始化过程
    C++ 语言的 15 个晦涩特性
    QT的项目管理文件pro的编写
    使用C++编写的一个Find(查找)对话框例子
    如何让Fedora能够打开RAR文件
    Undefined symbols for architecture i386:和"_OBJC_CLASS_$_xx", referenced from:问题解决方法
  • 原文地址:https://www.cnblogs.com/ganganloveu/p/4122506.html
Copyright © 2011-2022 走看看