zoukankan      html  css  js  c++  java
  • 【leetcode】Sum Root to Leaf Numbers(hard)

    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了,结果一看答案,立马郁闷了。不到10行就能搞定。

    具体的原理是深度优先,在向下迭代的过程中,用一个变量不断的把父节点以上的数字传下来,返回的时候把结果加起来。

    public int sumNumbers(TreeNode root) {
            return helper(root, 0);
    }
    
    public int helper(TreeNode root, int curSum) {
            if(root == null) return 0;
            curSum = curSum*10 + root.val;
            if(root.left == null && root.right == null) return curSum;
            return helper(root.left, curSum) + helper(root.right, curSum);
    }

    下面是我自己AC的代码,超长,超繁琐,当个反面例子吧。思路是把每个数字都存在一个vector里面。之所以繁琐是因为我只是在返回的时候下功夫。

    int sumNumbers(TreeNode *root) {
            int s, e, sum = 0;
            vector<vector<int>> v;
            Numbers(root, s, e, v);
            for(vector<vector<int>>::iterator it = v.begin(); it != v.end(); ++it)
            {
                int num = 0;
                while(!it->empty())
                {
                    num = num * 10 + it->back();
                    it->pop_back();
                }
                sum += num;
            }
            return sum;
        }
    
        void Numbers(TreeNode * root, int &s, int &e, vector<vector<int>>& v)
        {
            int sl = -1, el = -1, sr = -1, er = -1;
            s = e = -1;
            if(root == NULL) return;
            if(root->left == NULL && root->right == NULL) //在叶节点 压入新的数字
            {
                e = s = v.size();
                v.push_back(vector<int>(1,root->val));
                return;
            }
            if(root->left != NULL)
            {
                Numbers(root->left, sl, el, v);
                for(int i = sl; i <= el; ++i)
                {
                    v[i].push_back(root->val);
                }
                s = sl; e = el;
            }
            if(root->right != NULL)
            {
                Numbers(root->right, sr, er, v);
                for(int i = sr; i <= er; ++i)
                {
                    v[i].push_back(root->val);
                }
                s = (s == -1) ? sr : s;
                e = er;
            }
        }
  • 相关阅读:
    PHP-会话控制
    PHP-文件上传
    PHP-文档目录
    PHP-正则表达式
    PHP-数组类型
    PHP-函数编程
    PHP-基础知识
    $_FILES系统函数
    话说 MAX_FILE_SIZE
    Hello~! 我的blog
  • 原文地址:https://www.cnblogs.com/dplearning/p/4469468.html
Copyright © 2011-2022 走看看