[LeetCode]129.Sum Root to Leaf Numbers

2024-02-19 02:18
文章标签 leetcode sum numbers leaf 129

本文主要是介绍[LeetCode]129.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.

【分析】

每到一个叶子节点就代表一条路径的结束,一个值的产生。累加每个值。

【代码】

/*********************************
*   日期:2014-12-30
*   作者:SJF0115
*   题目: 129.Sum Root to Leaf Numbers
*   来源:https://oj.leetcode.com/problems/sum-root-to-leaf-numbers/
*   结果:AC
*   来源:LeetCode
*   博客:
*   时间复杂度:O(n)
*   空间复杂度:O(logn)
**********************************/
#include <iostream>
#include <queue>
#include <vector>
using namespace std;// 二叉树节点
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;}//ifreturn SumNumbers(root,0);}
private:int SumNumbers(TreeNode* node,int curSum){if(node == NULL){return 0;}//ifcurSum = curSum*10 + node->val;// 到达叶子节点返回该路径上的值if(node->left == NULL && node->right == NULL){return curSum;}// 左子树int leftSum = SumNumbers(node->left,curSum);// 右子树int rightSum = SumNumbers(node->right,curSum);return leftSum + rightSum;}
};
// 创建二叉树
TreeNode* CreateTreeByLevel(vector<int> num){int len = num.size();if(len == 0){return NULL;}//ifqueue<TreeNode*> queue;int index = 0;// 创建根节点TreeNode *root = new TreeNode(num[index++]);// 入队列queue.push(root);TreeNode *p = NULL;while(!queue.empty() && index < len){// 出队列p = queue.front();queue.pop();// 左节点if(index < len && num[index] != -1){// 如果不空创建一个节点TreeNode *leftNode = new TreeNode(num[index]);p->left = leftNode;queue.push(leftNode);}index++;// 右节点if(index < len && num[index] != -1){// 如果不空创建一个节点TreeNode *rightNode = new TreeNode(num[index]);p->right = rightNode;queue.push(rightNode);}index++;}//whilereturn root;
}int main() {Solution solution;// -1代表NULLvector<int> num = {1,2,3,4,-1,-1,5};TreeNode* root = CreateTreeByLevel(num);cout<<solution.sumNumbers(root)<<endl;
}



【思路二】

层次遍历


/*---------------------------------------
*   日期:2015-05-08
*   作者:SJF0115
*   题目: 129.Sum Root to Leaf Numbers
*   网址:https://leetcode.com/problems/sum-root-to-leaf-numbers/
*   结果:AC
*   来源:LeetCode
*   博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;// 二叉树节点
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 == nullptr){return 0;}//ifqueue<TreeNode*> nodeQueue;queue<int> sumQueue;nodeQueue.push(root);sumQueue.push(0);int curSum = 0;int totalSum = 0;TreeNode* node;// 层次遍历while(!nodeQueue.empty()){// 当前节点node = nodeQueue.front();nodeQueue.pop();// 当前路径和curSum = sumQueue.front();sumQueue.pop();curSum = curSum * 10 + node->val;// 左子结点if(node->left){nodeQueue.push(node->left);sumQueue.push(curSum);}//if// 右子结点if(node->right){nodeQueue.push(node->right);sumQueue.push(curSum);}//if// 叶子节点计算总和if(node->left == nullptr && node->right == nullptr){totalSum += curSum;}//if}//whilereturn totalSum;}
};


层次遍历,对与每个节点都要记住父节点的当前和。因为计算每个节点的当前和都会因父节点而不一样。

到达叶子节点代表一条路径的结束。这个当前和加入到总和中。

【思路三】

先序遍历的非递归版本

/*---------------------------------------
*   日期:2015-05-08
*   作者:SJF0115
*   题目: 129.Sum Root to Leaf Numbers
*   网址:https://leetcode.com/problems/sum-root-to-leaf-numbers/
*   结果:AC
*   来源:LeetCode
*   博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
using namespace std;// 二叉树节点
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 == nullptr){return 0;}//ifstack<TreeNode*> nodeStack;nodeStack.push(root);stack<int> sumStack;sumStack.push(0);TreeNode* node;int curSum = 0;int totalSum = 0;// 先序遍历 非递归while(!nodeStack.empty()){// 当前节点node = nodeStack.top();nodeStack.pop();// 当前路径和curSum = sumStack.top();sumStack.pop();curSum = curSum * 10 + node->val;// 右子节点if(node->right){nodeStack.push(node->right);sumStack.push(curSum);}//if// 左子结点if(node->left){nodeStack.push(node->left);sumStack.push(curSum);}//if// 叶子节点计算总和if(node->left == nullptr && node->right == nullptr){totalSum += curSum;}//if}//whilereturn totalSum;}
};


【温故】

/*---------------------------------------
*   日期:2015-05-08
*   作者:SJF0115
*   题目: 129.Sum Root to Leaf Numbers
*   网址:https://leetcode.com/problems/sum-root-to-leaf-numbers/
*   结果:AC
*   来源:LeetCode
*   博客:
-----------------------------------------*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;// 二叉树节点
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 == nullptr){return 0;}//ifint curSum = 0;int totalSum = 0;helper(root,curSum,totalSum);return totalSum;}
private:void helper(TreeNode* root,int curSum,int &totalSum){if(root == nullptr){return;}//if// 先序遍历curSum = curSum * 10 + root->val;// 在叶子节点处计算总和if(root->left == nullptr && root->right == nullptr){totalSum += curSum;return;}//if// 左子树helper(root->left,curSum,totalSum);// 右子树helper(root->right,curSum,totalSum);}
};




这篇关于[LeetCode]129.Sum Root to Leaf Numbers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/723198

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

最大流=最小割=最小点权覆盖集=sum-最大点权独立集

二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。 在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。   二分图最小点权覆盖     从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。 建模:     原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

计蒜客 Half-consecutive Numbers 暴力打表找规律

The numbers 11, 33, 66, 1010, 1515, 2121, 2828, 3636, 4545 and t_i=\frac{1}{2}i(i+1)t​i​​=​2​​1​​i(i+1), are called half-consecutive. For given NN, find the smallest rr which is no smaller than NN

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划