Google 태그 관리자 아이콘

알고리즘 풀이

.leetcode(112. Path Sum)

silvergoni 2022. 1. 16. 17:36
반응형

https://leetcode.com/problems/path-sum/

 

2. 2022/05/12 시도

소요시간: 8분(recursive-topdown), 8분(iterative-dfs)

// recursive-topdown
class Solution {
    boolean hasAnswer = false;
    int targetSum;
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }

        this.targetSum = targetSum;
        recursive(root, 0);
        return hasAnswer;
    }
    
    private void recursive(TreeNode root, int sum) {
        if (hasAnswer) {
            return;
        }

        if (root.left == null && root.right == null && targetSum == sum + root.val) {
            hasAnswer = true;
            return;
        }

        if (root.left != null) {
            recursive(root.left, sum + root.val);
        }

    if (root.right != null) {
            recursive(root.right, sum + root.val);
        }
    }
}
// iterative-dfs
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        
        Stack<TreeNode[]> stack = new Stack<>();
        stack.push(new TreeNode[]{root, new TreeNode(root.val)});
        
        while (!stack.isEmpty()) {
            TreeNode[] nodes = stack.pop();
            TreeNode onode = nodes[0];
            TreeNode snode = nodes[1];
            
            if (onode.left == null && onode.right == null && snode.val == targetSum) {
                return true;
            }
            
            if (onode.left != null) {
                stack.push(new TreeNode[]{onode.left, new TreeNode(snode.val + onode.left.val)});
            }
            
            if (onode.right != null) {
                stack.push(new TreeNode[]{onode.right, new TreeNode(snode.val + onode.right.val)});
            }
        }

        return false;               
    }
}
// iterative-bfs
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        
        Queue<TreeNode[]> queue = new LinkedList<>();
        queue.offer(new TreeNode[]{root, new TreeNode(root.val)});
        
        while (!queue.isEmpty()) {
            TreeNode[] nodes = queue.poll();
            TreeNode onode = nodes[0];
            TreeNode snode = nodes[1];
            
            if (onode.left == null && onode.right == null && snode.val == targetSum) {
                return true;
            }
            
            if (onode.left != null) {
                queue.offer(new TreeNode[]{onode.left, new TreeNode(snode.val + onode.left.val)});
            }
            
            if (onode.right != null) {
                queue.offer(new TreeNode[]{onode.right, new TreeNode(snode.val + onode.right.val)});
            }
        }

        return false;               
    }
}

풀이 접근 과정

recursive-topdown
iterative-dfs
iterative-bfs

 

느낀점

  • recursive-bottomup은 이번에 생각하지 못했다. 아래 첫번째 시도에서 처럼 하면 bottomup으로도 풀 수 있다.

1. 2022.01.16 시도

소요시간: 6분(recursive), 4분(iterative)

// recursive-buttomup
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        
        if (root.left == null && root.right == null) {
            if (root.val == targetSum) {
                return true;
            }
            return false;
        }

        int nextTargetSum = targetSum-root.val;
        boolean result1 = hasPathSum(root.left, nextTargetSum);
        boolean result2 = hasPathSum(root.right, nextTargetSum);
        return result1 || result2;
    }
}
// iterative-dfs
class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        
        LinkedList<TreeNode> stack = new LinkedList<>();
        stack.push(root);
        
        while(!stack.isEmpty()) {
            TreeNode node = stack.pop();
               
            if (node.left == null && node.right == null) {
                if (node.val == targetSum) {
                    return true;
                }
            }
            
            if (node.left != null) {
                node.left.val += node.val;
                stack.push(node.left);
            }
            
            if (node.right != null) {
                node.right.val += node.val;
                stack.push(node.right);
            }
        }
     
        return false;
    }
}

풀이 접근 과정

이전에 많이 풀던 방식(TreeNode)으로 tree는 recursive, iterative방식으로 풀어보면 되겠다 싶었다. recursive할때는 재귀가 될때마다 지금 현재 값을 마이너스해서 노드값하고 비교하면 된다고 생각했다.

iterative에서는 반대로 노드에 값을 더해가면서 targetSum과 비교할 수 있게 하였다.

 

느낀점

  • 크게 어려운점은 없었다.

알고리즘 정리노트: .leetcode(알고리즘 문제풀이 접근)

반응형

 

'알고리즘 풀이' 카테고리의 다른 글

.leetcode(709. To Lower Case)  (0) 2022.01.17
.leetcode(704. Binary Search)  (0) 2022.01.17
.leetcode(7. Reverse Integer)  (0) 2022.01.16
.leetcode(9. Palindrome Number)  (0) 2022.01.10
.leetcode(226. Invert Binary Tree)  (0) 2022.01.09