• Sum Root to Leaf Numbers


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

        1
       / 
      2   3

    Return the sum = 12 + 13 = 25.

    思路:递归

    首先有好几种思路,本程序写的是从顶端到本结点的一个sum值,非所有的。也可以写一个代表所有的sum总和值得。

    代码2很巧妙的,用了一个全局变量sum,函数递归调用很不错。值得参考。

    两种方法:

    >1、

    sumHelper(TreeNode *root,int sum),

    首先判断本节点是否为空,为空直接返回0,接着开始计算,注意,这里的sum是指从根节点到此节点的上一个节点的sum之和

    再者就是判断两个孩子是否都为空

    所以最后的函数递归调用sumHelper(root->left,sum)+sumHelper(root->right,sum);

    >2、

    深搜。

    首先判断是否到左右孩子均没有的情况,sum是一个全局变量,此时,我先搜索到最深节点,注意递归内容:10*num+root->left->val

    这就是本条路径的所有行进到此节点的sum和,然后我再判断是否左右节点存在,继续用sum分别加上左杰节点内容,而不会改变值大小。



    代码:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution1 {
    public:
        int sumNumbers(TreeNode* root) {
            
            return sumHelper(root,0);
        }
        
        int sumHelper(TreeNode *root,int sum){
            if(root==NULL){
                return 0;
            }
            sum=sum*10+root->val;
            if(root->left==NULL&&root->right==NULL){
                return sum;
            }
            //这个sum应该是代表从顶端到此刻结点的总和。
            return sumHelper(root->left,sum)+sumHelper(root->right,sum);
        }
    };


    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution2 {
    public:
        int sum=0;
        int sumNumbers(TreeNode* root) {
            int result=0;
            if(root==NULL){
                return 0;
            }
            dfs(root,root->val);
            return sum;
        }
        
        int dfs(TreeNode *root,int num){
            if(root->left==NULL&&root->right==NULL){
                sum+=num;//这个时候是总和
            }
            if(root->left!=NULL){
                dfs(root->left,10*num+root->left->val);
            }
            if(root->right!=NULL){
                dfs(root->right,10*num+root->right->val);
            }
            
        }
        
    };



  • 相关阅读:
    C语言main函数参数解析代码模板
    C语言函数指针复习小程序
    反转链表
    (Mingw32环境下)C语言使用库函数分配内存,按指定字节对齐
    Scrum meeting 3
    胆大妄为【DDWW】 Scrum meeting 2
    胆大妄为【DDWW】 Scrum meeting 1
    胆大妄为【DDWW】 《实验八 团队作业4:团队项目需求建模与系统设计》
    胆大妄为【DDWW】 实验七 团队作业3:团队项目需求分析与原型设计
    胆大妄为【DDWW】 实验六 团队作业2 :西北师范大学毕业生就业信息管理系统
  • 原文地址:https://www.cnblogs.com/jsrgfjz/p/8526415.html
Copyright © 2020-2023  润新知