diff --git a/Leecode/src/main/java/com/markilue/leecode/tree/HasPathSum.java b/Leecode/src/main/java/com/markilue/leecode/tree/HasPathSum.java new file mode 100644 index 0000000..937151e --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/tree/HasPathSum.java @@ -0,0 +1,153 @@ +package com.markilue.leecode.tree; + +import org.junit.Test; + +import java.util.Stack; + +/** + * @BelongsProject: Leecode + * @BelongsPackage: com.markilue.leecode.tree + * @Author: dingjiawen + * @CreateTime: 2022-09-23 16:54 + * @Description: + * TODO 力扣112题 路径总和: + * 给你二叉树的根节点root 和一个表示目标和的整数targetSum 。 + * 判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和targetSum 。 + * 如果存在,返回 true ;否则,返回 false 。 + *
+ * 叶子节点 是指没有子节点的节点。
+ * @Version: 1.0
+ */
+public class HasPathSum {
+
+ @Test
+ public void test() {
+ TreeNode root = new TreeNode(5);
+ TreeNode TreeNode2 = new TreeNode(4);
+ TreeNode TreeNode3 = new TreeNode(8);
+ TreeNode TreeNode4 = new TreeNode(11);
+ TreeNode TreeNode5 = new TreeNode(13);
+ TreeNode TreeNode6 = new TreeNode(4);
+ TreeNode TreeNode7 = new TreeNode(7);
+ TreeNode TreeNode8 = new TreeNode(2);
+ TreeNode TreeNode9 = new TreeNode(1);
+
+ root.setRight(TreeNode3);
+ root.setLeft(TreeNode2);
+ TreeNode2.setLeft(TreeNode4);
+ TreeNode3.setLeft(TreeNode5);
+ TreeNode3.setRight(TreeNode6);
+ TreeNode4.setLeft(TreeNode7);
+ TreeNode4.setRight(TreeNode8);
+ TreeNode6.setRight(TreeNode9);
+
+ System.out.println(hasPathSum(root, 22));
+ }
+
+ @Test
+ public void test1() {
+ TreeNode root = new TreeNode(1);
+ TreeNode TreeNode2 = new TreeNode(2);
+// TreeNode TreeNode3 = new TreeNode(8);
+// TreeNode TreeNode4 = new TreeNode(11);
+// TreeNode TreeNode5 = new TreeNode(13);
+// TreeNode TreeNode6 = new TreeNode(4);
+// TreeNode TreeNode7 = new TreeNode(7);
+// TreeNode TreeNode8 = new TreeNode(2);
+// TreeNode TreeNode9 = new TreeNode(1);
+
+// root.setRight(TreeNode3);
+ root.setLeft(TreeNode2);
+// TreeNode2.setLeft(TreeNode4);
+// TreeNode3.setLeft(TreeNode5);
+// TreeNode3.setRight(TreeNode6);
+// TreeNode4.setLeft(TreeNode7);
+// TreeNode4.setRight(TreeNode8);
+// TreeNode6.setRight(TreeNode9);
+
+ System.out.println(hasPathSum1(root, 1));
+ }
+
+ /**
+ * 自己思路递归法:
+ * 速度击败100%,内存击败59.98%
+ */
+ public boolean hasPathSum(TreeNode root, int targetSum) {
+ if (root == null) {
+ return false;
+ }
+
+ return sum(root, 0, targetSum);
+
+ }
+
+ public boolean sum(TreeNode node, int sum, int targetSum) {
+ sum += node.val;
+ if (node.left == null && node.right == null) {
+ return sum == targetSum;
+ }
+ boolean left = false;
+ boolean right = false;
+ if (node.left != null) {
+ left = sum(node.left, sum, targetSum);
+ }
+ if (node.right != null) {
+ right = sum(node.right, sum, targetSum);
+ }
+ return left || right;
+ }
+
+ /**
+ * 自己思路迭代法:
+ * 速度击败6.58%,内存击败54.85%
+ */
+ public boolean hasPathSum1(TreeNode root, int targetSum) {
+
+ if (root == null) {
+ return false;
+ }
+ Stack> pathSum(TreeNode root, int targetSum) {
+ if(root==null){
+ return new ArrayList<>();
+ }
+ List
> result = new ArrayList<>();
+ path(root,targetSum,0,new ArrayList<>(),result);
+ return result;
+
+ }
+
+
+ public void path(TreeNode node,int targetSum,int sum,List
> result){
+ sum+=node.val;
+ list.add(node.val);
+ if(node.left==null&&node.right==null&&sum==targetSum){
+ //换一个list,避免修改这一个
+ List
> ret = new LinkedList
>();
+ Map
> pathSum1(TreeNode root, int targetSum) {
+ if (root == null) {
+ return ret;
+ }
+
+ Queue