路径和是否等于给定值

路径和是否等于给定值

问题

这个题目说的是,给你一棵二叉树和一个整数,你要判断这棵二叉树上是否存在一条从根到叶子节点的路径,这条路径上所有节点中的数字相加等于给你的整数。

比如说,给你的二叉树是:

    1
  /   \
 2     4
      / \
     8  16

给你的整数是 13。在这棵二叉树中存在一条从根到叶子节点的路径 1->4->8,路径上的数字加起来等于 13,于是要返回 true。

代码

public class AlgoCasts {

  public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
      val = x;
    }
  }

  // Time: O(n), Space: O(n)
  public boolean hasPathSumRecursive(TreeNode root, int sum) {
    if (root == null) return false;
    if (root.left == null && root.right == null) return root.val == sum;
    return hasPathSumRecursive(root.left, sum - root.val) ||
      hasPathSumRecursive(root.right, sum - root.val);
  }

  // Time: O(n), Space: O(n)
  public boolean hasPathSumIterative(TreeNode root, int sum) {
    if (root == null) return false;
    Stack<TreeNode> stack = new Stack<>();
    Stack<Integer> sumStack = new Stack<>();
    stack.push(root);
    sumStack.push(sum);

    while (!stack.isEmpty()) {
      TreeNode n = stack.pop();
      int s = sumStack.pop();
      if (n.left == null && n.right == null && n.val == s) return true;
      if (n.left != null) {
        stack.push(n.left); sumStack.push(s - n.val);
      }
      if (n.right != null) {
        stack.push(n.right); sumStack.push(s - n.val);
      }
    }
    return false;
  }

}

 上一篇
二叉搜索树中删除节点 二叉搜索树中删除节点
二叉搜索树中删除节点问题 这个题目说的是,给你一棵二叉搜索树和一个数值,你要删除二叉搜索树上等于这个数值的节点,然后返回处理后的二叉搜索树。 注意,二叉搜索树的节点上没有重复数值,并且要求删除节点后返回的仍然是二叉搜索树。 比如说,给你的二
2018-12-09
下一篇 
爬楼梯的最小代价 爬楼梯的最小代价
爬楼梯的最小代价问题 这个题目说的是,给你一个整数数组,数组中的整数表示爬对应阶楼梯的代价。你可以从第 0 阶或第 1 阶楼梯开始爬,每次可以向上爬 1 阶或 2 阶。那么请问,爬完这个楼梯的最小代价是多少? 比如说,给你的代价数组 c 是
2018-12-09
  目录