• [LeetCode] Path Sum


    This problem has a very easy recursive code as follows.

     1 class Solution {
     2 public:
     3     bool hasPathSum(TreeNode* root, int sum) {
     4         if (!root) return false;
     5         if (!(root -> left) && !(root -> right))
     6             return sum == root -> val;
     7         return hasPathSum(root -> left, sum - root -> val) ||
     8                hasPathSum(root -> right, sum - root -> val);
     9     }
    10 };

    If you insist on an iterative solution, this link has a clean iterative solution in Python. I rewrite the code in C++ as follows. In fact, it uses pair<TreeNode*, int> to recor the information, which greatly simplifies the code.

     1 class Solution {
     2 public:
     3     bool hasPathSum(TreeNode* root, int sum) {
     4         if (!root) return false;
     5         stack<pair<TreeNode*, int> > pairs;
     6         pairs.push(make_pair(root, sum));
     7         while (!pairs.empty()) {
     8             pair<TreeNode*, int> pr = pairs.top();
     9             pairs.pop();
    10             TreeNode* node = pr.first;
    11             int remain = pr.second;
    12             if (!(node -> left) && !(node -> right) && remain == node -> val)
    13                 return true;
    14             if (node -> left)
    15                 pairs.push(make_pair(node -> left, remain - node -> val));
    16             if (node -> right)
    17                 pairs.push(make_pair(node -> right, remain - node -> val));
    18         }
    19         return false;
    20     }
    21 };

    This link gives a longer iterative solution using postorder traversal.

     1 class Solution {
     2 public:
     3     bool hasPathSum(TreeNode* root, int sum) {
     4         TreeNode* pre = NULL;
     5         TreeNode* cur = root;
     6         stack<TreeNode*> nodes;
     7         int s = 0;
     8         while (cur || !nodes.empty()) {
     9             while (cur) {
    10                 nodes.push(cur);
    11                 s += cur -> val;
    12                 cur = cur -> left;
    13             }
    14             cur = nodes.top();
    15             if (!(cur -> left) && !(cur -> right) && s == sum)
    16                 return true;
    17             if (cur -> right && pre != cur -> right)
    18                 cur = cur -> right;
    19             else {
    20                 pre = cur;
    21                 nodes.pop();
    22                 s -= cur -> val;
    23                 cur = NULL;
    24             }
    25         }
    26         return false;
    27     }
    28 };
  • 相关阅读:
    R语言介绍与安装
    待分析数据数值化
    网络环路与攻击和谷歌的四个8
    基于storm和hadoop的广告系统研究【5】
    Xpath语法
    Xcode编译工具
    关于Xcode的Other Linker Flags
    iOS项目的目录结构和开发流程
    Objective-C中关于NSArray, NSDictionary, NSNumber等写法的进化
    Windows 8 常见教程
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4639502.html
Copyright © 2020-2023  润新知