博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【LeetCode】129. Sum Root to Leaf Numbers (2 solutions)
阅读量:4548 次
发布时间:2019-06-08

本文共 2591 字,大约阅读时间需要 8 分钟。

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.

 

每到达一个根节点,就代表一个路径访问完成,将和加入总和。

 

解法一:

树结构用递归是最容易的,每递归一层,上层的部分和需要乘以10在做加法。

/** * 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 sumNumbers(TreeNode *root) {        int Sum = 0;        Helper(root, 0, Sum);        return Sum;    }    void Helper(TreeNode* root, int partSum, int& Sum)    {        if(root == NULL)            return;        else if(root->left == NULL && root->right == NULL)  //add this path            Sum += (10*partSum+root->val);        else        {            Helper(root->left, 10*partSum+root->val, Sum);            Helper(root->right, 10*partSum+root->val, Sum);        }    }};

 

解法二:

非递归方法,使用栈存放当前的路径进行深度搜索,并设置部分和记录栈中的数值。

结合进栈与出栈进行部分和调整:

进栈:部分和*10+当前值

出栈:(部分和-当前值)/10

如果遍历到叶节点,则将部分和加入总和。

/** * 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:    int sumNumbers(TreeNode* root) {        if(root == NULL)            return 0;        int ret = 0;        int cur = 0;        stack
stk; unordered_map
visited; stk.push(root); visited[root] = true; cur += root->val; while(!stk.empty()) { TreeNode* top = stk.top(); if(top->left != NULL && visited[top->left] == false) { stk.push(top->left); visited[top->left] = true; cur = cur*10 + top->left->val; continue; } if(top->right != NULL && visited[top->right] == false) { stk.push(top->right); visited[top->right] = true; cur = cur*10 + top->right->val; continue; } if(top->left == NULL && top->right == NULL) { ret += cur; } stk.pop(); cur = (cur - top->val) / 10; } return ret; }};

转载于:https://www.cnblogs.com/ganganloveu/p/4122506.html

你可能感兴趣的文章
ConfigParser模块
查看>>
如何开发优质的 Flutter App:Flutter App 软件测试指南
查看>>
决胜Flutter 第一章 熟悉战场
查看>>
如何开发优质的 Flutter App:Flutter App 软件调试指南
查看>>
决胜经典算法之冒泡排序
查看>>
决胜经典算法之选择排序
查看>>
单元格数据类型
查看>>
mysql表设计---时间类型
查看>>
wamp服务器
查看>>
Codeforces 1144G Two Merged Sequences dp
查看>>
STL内存分配方式
查看>>
NS2移动节点
查看>>
python学习之路(十一)
查看>>
CSS让浮动元素水平居中
查看>>
-----------------时间线分水岭--------------------------
查看>>
Stsadm.exe 怎么用?
查看>>
使用spring中4.2.6版本使用@Value取值失败,结果为${xxx}的情况
查看>>
LOJ6583 ICPC World Finals 2019何以伊名始(广义后缀自动机)
查看>>
lightoj 1031【区间DP,未完待续】
查看>>
11、求二进制中1的个数
查看>>