使用广度优先
使用2个队列,一个纪录树的节点,一个纪录节点对应的值
时间O(n)(每个节点都被访问一遍),空间O(n)(叶子节点最多为平衡二叉树情况下n/2)
public boolean hasPathSum(TreeNode root, int targetSum) { if (root==null) return false; Deque<TreeNode> queue1 = new LinkedList<TreeNode>(); Deque<Integer> queue2 = new LinkedList<Integer>(); queue1.add(root); queue2.add(root.val); while(!queue1.isEmpty()){ TreeNode tempNode = queue1.poll(); int temp = queue2.poll(); // 注意题目要求,根节点到叶子节点的距离,不是叶子节点则不满足要求 if (tempNode.left==null && tempNode.right==null){ if (temp==targetSum){ return true; } continue; } // 依次将左右孩子压入队列中 if (tempNode.left!=null){ queue1.add(tempNode.left); queue2.add(tempNode.left.val+temp); } if (tempNode.right!=null){ queue1.add(tempNode.right); queue2.add(tempNode.right.val+temp); } } return false; }