给定一个二叉树,它的每个结点都存放一个 0-9
的数字,每条从根到叶子节点的路径都代表一个数字。
例如,从根到叶子节点路径 1->2->3
代表数字 123
。
计算从根到叶子节点生成的所有数字之和。
说明: 叶子节点是指没有子节点的节点。
示例 1:
输入: [1,2,3] 1 / 2 3 输出: 25 解释: 从根到叶子节点路径1->2
代表数字12
. 从根到叶子节点路径1->3
代表数字13
. 因此,数字总和 = 12 + 13 =25
.
示例 2:
输入: [4,9,0,5,1] 4 / 9 0 / 5 1 输出: 1026 解释: 从根到叶子节点路径4->9->5
代表数字 495. 从根到叶子节点路径4->9->1
代表数字 491. 从根到叶子节点路径4->0
代表数字 40. 因此,数字总和 = 495 + 491 + 40 =1026
.
思路:
- 通过压栈的方式访问树的每一条路径,每压进一个结点,就把结点的值加到t中
- 用布尔量fl,fr来表示左右结点是否访问
- 用sum来储存所有路径的值,t用来表示每一条路径的值
- 当访问到叶子结点时候:
- 当fl和fr均为true的时候,表示该节点的两个子结点都已经遍历了,将其弹出,且把t值除以10
- 当fl和fr只有一个为false的时候,表示一条路径到底,把t值加到sum中,t值除以10,fr或者fl置反
为什么要除以10呢? 因为当前的值弹出,位数减少以为,等价于出去最低位,所以除以10
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 #include<stack> 11 #include<vector> 12 class Solution { 13 public: 14 vector<int> s; 15 vector<TreeNode*> v; 16 int sumNumbers(TreeNode* root) { 17 if(root == NULL) return 0; 18 int sum = 0, t = root->val; 19 stack<TreeNode*> s; 20 s.push(root); 21 if(root->left==NULL && root->right==NULL)return t; 22 bool fl = true, fr = true; 23 while(!s.empty()){ 24 TreeNode* temp = s.top(); 25 if(temp == NULL) break; 26 if(temp->left) {//遍历每一条路径 27 s.push(temp->left); 28 t = t*10 + temp->left->val; 29 temp->left = NULL; 30 fl = false; 31 fr = true; 32 }else if(temp->right){ 33 s.push(temp->right); 34 t = t*10 + temp->right->val; 35 temp->right = NULL; 36 fl = true; 37 fr = false; 38 }else{//遍历完一条完整的路径 39 if(!fl){ 40 sum += t; 41 t /= 10; 42 fl = true; 43 } 44 else if(!fr){ 45 sum += t; 46 t /= 10; 47 fr = true; 48 } 49 else if(fl&&fr){ 50 t/=10; 51 } 52 s.pop(); 53 } 54 } 55 return sum; 56 } 57 };
用递归的方法试一试这道题,代码会简短很多
dfs遍历树的时候,会从根结点一条路变量到叶子结点,每进行一次dfs递归,相当于压栈一个结点
遍历结束于叶子结点,当把一条路径的值添加到ans中后,需要除以10,原因同上面
1 class Solution { 2 public: 3 void dfs(TreeNode* root, int& ans, int& temp){ 4 if(root == NULL) return; 5 temp = temp*10 + root->val; 6 if(root->left == NULL && root->right == NULL) ans += temp; 7 dfs(root->left, ans, temp); 8 dfs(root->right, ans, temp); 9 temp /= 10; 10 } 11 int sumNumbers(TreeNode* root) { 12 int ans = 0, temp = 0; 13 dfs(root, ans, temp); 14 return ans; 15 } 16 };