• 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
  • 相关阅读:
    用汇编的眼光看C++(之算术符重载) 四
    用汇编的眼光看C++(之嵌入汇编) 四
    用汇编的眼光看C++(之const属性) 四
    用汇编的眼光看C++(之虚函数) 四
    用汇编的眼光看C++(之类继承) 四
    用汇编的眼光看C++(之模板类) 四
    用汇编的眼光看C++(之class构造、析构) 四
    用汇编的眼光看C++(之类静态变量、静态函数) 四
    用汇编的眼光看C++(之特殊函数) 四
    多线程基础知识
  • 原文地址:https://www.cnblogs.com/mr-stn/p/8969866.html
Copyright © 2020-2023  润新知