程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> leetcode:Sum Root to Leaf Numbers

leetcode:Sum Root to Leaf Numbers

編輯:關於C++

一、 題目

給一個二叉樹,其中節點只可能是數字0-9,每一條路徑組成一個數。

如下:

1

/ \

2 3

左邊路徑1->2 代表 12.

右邊路徑1->3 代表 13.

sum = 12 + 13 = 25.

二、 分析

想起了一句話,樹的問題可歸結為遞歸問題,這道題也一樣,每次經過一個節點會遇到三中情況:

1、不包含左/右節點;

2、普通節點,即擁有有效的左或右節點;

3、無效節點(NULL);

而這三種情況對應於遞歸實現中的三種不同的實現方式:

1、sum * 10 + root->val;

2、helper(root->left, sum * 10 + root-val) + helper(root->right, sum * 10 + root-val);

3、return 0

代碼:

/**
 * 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 helper(TreeNode *root, int sum){
        if(root == NULL)
            return 0;
        if(root->left == NULL && root->right == NULL){
            return (sum * 10 + root->val);
        }
        else {
            return helper(root->left, sum * 10 + root->val) + helper(root->right, sum * 10 + root->val);
        }
    }
    int sumNumbers(TreeNode *root) {
            return helper(root, 0);
    }
};


另一種思路是每當遇到一個葉子節點時就將當前的和加入到總和中,即sum和c_sum,直到遍歷完所有的葉子節點。

如下:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void helper(TreeNode *root, int &sum, int c_sum){
        if(root == NULL)
            return ;
        c_sum = c_sum * 10 + root->val;
        helper(root->left, sum, c_sum);
        helper(root->right, sum, c_sum);
        if(root->left == NULL && root->right == NULL)
            sum += c_sum;
    }
    int sumNumbers(TreeNode *root) {
        int sum = 0;
        helper(root, sum, 0);
        return sum;
    }
};


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved