• Leetcode[129]-Sum Root to Leaf Numbers


    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);
            }
    
        }
    };
  • 相关阅读:
    Vue中v-on的指令以及一些其他指令
    Vue模板语法中数据绑定
    Vue介绍以及模板语法-插值
    JQ中的Ajax的封装
    跨域问题的解决?
    Ajax的快速入门
    如何使用npm的部分用法以及npm被墙的解决方法
    使用Node.js简单创建一个服务器
    机智云连接ESP8266--远程控制点亮RGB灯
    1、索引的概念和分类
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7162121.html
Copyright © 2020-2023  润新知