LeetCode C++ 129. Sum Root to Leaf Numbers【Tree/DFS】中等
发布日期:2021-07-01 02:52:57
浏览次数:3
分类:技术文章
本文共 2540 字,大约阅读时间需要 8 分钟。
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.
Note: A leaf is a node with no children.
Example:
Input: [1,2,3] 1 / \ 2 3Output: 25Explanation:The root-to-leaf path 1->2 represents the number 12.The root-to-leaf path 1->3 represents the number 13.Therefore, sum = 12 + 13 = 25.
Example 2:
Input: [4,9,0,5,1] 4 / \ 9 0 / \5 1Output: 1026Explanation:The root-to-leaf path 4->9->5 represents the number 495.The root-to-leaf path 4->9->1 represents the number 491.The root-to-leaf path 4->0 represents the number 40.Therefore, sum = 495 + 491 + 40 = 1026.
题意:给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3
代表数字 123
。计算从根到叶子节点生成的所有数字之和。
思路1 递归先序搜索
先序遍历,计算和即可。代码如下:
class Solution { public: int getAllNumbers(TreeNode* root, int num) { if (!root) return 0; if (!root->left && !root->right) return num * 10 + root->val; int val = num * 10 + root->val; return getAllNumbers(root->left, val) + getAllNumbers(root->right, val); } int sumNumbers(TreeNode* root) { return getAllNumbers(root, 0); }};
效率如下:
执行用时:0 ms, 在所有 C++ 提交中击败了100.00% 的用户内存消耗:12.2 MB, 在所有 C++ 提交中击败了34.94% 的用户
20201029 Update 如果使用原函数的话,可以写成如下形式:
class Solution { public: int sum = 0, num = 0; int sumNumbers(TreeNode* root) { if (root == nullptr) return 0; num = num * 10 + root->val; if (root->left == nullptr && root->right == nullptr) sum += num; sumNumbers(root->left); sumNumbers(root->right); num /= 10; //回溯到上一层 return sum; }};
效率不是很好:
执行用时:8 ms, 在所有 C++ 提交中击败了35.13% 的用户内存消耗:12.4 MB, 在所有 C++ 提交中击败了28.99% 的用户
思路2 非递归先序遍历
实际代码如下:
class Solution { public: int sumNumbers(TreeNode* root) { stackst; int sum = 0; TreeNode *temp = root; while (temp || !st.empty()) { while (temp) { st.push(temp); if (temp->left) temp->left->val += temp->val * 10; //修改原树上的值 temp = temp->left; } temp = st.top(); st.pop(); if (!temp->left && !temp->right) sum += temp->val; //遇到叶子节点 if (temp->right) temp->right->val += temp->val * 10; //修改原树上的值 temp = temp->right; } return sum; }};
效率如下:
执行用时:8 ms, 在所有 C++ 提交中击败了34.87% 的用户内存消耗:12.2 MB, 在所有 C++ 提交中击败了36.07% 的用户
转载地址:https://memcpy0.blog.csdn.net/article/details/108923555 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月05日 23时12分07秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
EFI Shell 命令参考
2019-05-02
HP-UX oracle RAC 双机实践
2019-05-02
解决SHELL脚本中的export无法生效的问题【转】
2019-05-02
linux中的sh脚本语法【转】
2019-05-02
区别数据结构中的堆栈与内存中的堆栈的个人总结【转】
2019-05-02
c++中冒号(:)和双冒号(::)的用法【转】
2019-05-02
python中各种下划线的含义
2019-05-02
《计算机视觉-一种现代方法(第2版)》读书笔记三:早期视觉(一幅图像)
2019-05-02
《计算机视觉-一种现代方法(第2版)》读书笔记六:应用之图像搜索和检索
2019-05-02
如何撰写高水平的学术论文
2019-05-02
谭浩强《C++面向对象程序设计》知识点总结
2019-05-02
分享一个关于介绍TextCNN和TextRNN的文章
2019-05-02
关于CNN中感受野的理解和计算方法
2019-05-02
java基础----RandomAccessFile
2019-05-02
__attribute__((packed))
2019-05-02
Android深入浅出之Binder机制
2019-05-02
linux查看硬件信息
2019-05-02
linux支持大于4G内存
2019-05-02
WM_GETINFO相关
2019-05-02
填入空隙(setbkcolor,setbkmode)
2019-05-02