zoukankan      html  css  js  c++  java
  • leetcode 129. 求根到叶子节点数字之和

    给定一个二叉树,它的每个结点都存放一个 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 };
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符删除
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
    Java实现 蓝桥杯VIP 算法训练 字符串编辑
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8969866.html
Copyright © 2011-2022 走看看