TIL/Coding Test

[LeetCode] Binary Tree Inorder Traversal

반응형

오늘의 문제는 이진 트리 구현해보기. 전에 멘토 언니가 공부한 담에 꼭 손으로 구현해 보세요, 라고 했는데 혼자선 안 할 거 같아서 냉큼 문제로 올렸다. 

leetcode.com/explore/interview/card/top-interview-questions-medium/108/trees-and-graphs/786/ 

처음 삽질한 흔적. 아.. 길다...

public class cote0310_786_BinaryTreeInorderTraversal {
    //Definition for a binary tree node.
    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode() {}
        TreeNode(int val) { this.val = val; }
        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
    
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        //왼쪽 노드가 있으면 왼쪽 노드를 먼저 방문하고
        //더 이상 왼쪽 노드가 없는 왼쪽 노드를 방문했거나 왼쪽 노드가 없으면 루트를 방문하고
        //그 다음엔 오른쪽 노드를 방문한다.

        //왼쪽 노드를 방문하기 위해서는 우선 왼쪽 노드값이 null인지 아닌지 판단해야 한다 
        if(root.left != null){ //왼쪽 노드가 널값이 아니면 왼쪽 노드 방문
            //근데 재귀로 들어가야 하는 거 같다. 결국 왼쪽 노드가 널인지 아닌지를 계속 판단해줘야 한다.
        }else{ //왼쪽 노드가 널이면 루트 방문 후 오른쪽 방문

        }
        boolean bool=true;
        TreeNode leftNode=root;
        TreeNode rootNode;
        TreeNode rightNode;
        while(leftNode.left != null){ //왼쪽이 아니면 왼쪽의 왼쪽을 또 찾아준다
            rootNode=visitLeft(leftNode);
            rightNode=new TreeNode(leftNode.right.val, leftNode.right.left, leftNode.right.right);
            leftNode=rootNode;
            //leftRootNode의 왼쪽 노드가 널이면 루트가 leftNode가 된다
            if(rootNode.left==null){
                list.add(rootNode.val); //이제 루트값을 넣어주고
                if(rightNode.left != null){ //오른쪽 노드에 왼쪽 노드가 달려있는지 검사한다
                }
            }
            //leftRootNode의 왼쪽 노드가 널이 아니면 visitLeft가 한번 더 돌아간다 
            //왼쪽 노드를 방문한 뒤에 rightNode가 널인지 아닌지 검사한다
            //rightNode가 널이면 루트노드를 타고 올라간다 
            //rightNode가 널이 아니면 right노드를 leftRootNode삼아 visitLeft를 실행한다
        } //와일문을 벗어나면 왼쪽노드가 널값인 leftNode가 나오게 됨

        list.add(leftNode.val); //그럼 그 값을 리스트에 더해주고
        list.add(rootNode.val);  //이제 루트값을 넣어주고
        list.add(rootNode.right.val); //오른쪽값을 넣어준다

        return list;
    }

    public static TreeNode visitLeft(TreeNode root){
        return TreeNode(root.left.val, root.left.left, root.left.right);
    }

    public static TreeNode findRoot(TreeNode root){
        return TreeNode(root.left.val, root.left.left, root.left.right);
    }

그 다음으로 삽질한 흔적. 뭔가 답에 근접하게 생각한거 같긴 한데 정답을 맞추진 못했다.

 public void makeNodeList(List<Integer> list, TreeNode rootNode){
        if(rootNode.left == null && rootNode.right == null){ //더 이상 자식노드가 없으면 
            list.add(rootNode.val); //리스트에 밸류 더하고
            //거슬러 올라가야 하는디
            makeNodeList(list, parentNode);
        }else if(rootNode.left != null){ //왼쪽 자식 노드가 있으면 왼쪽 노드를 루트 노드로 삼아서 다시 탐색
            makeNodeList(list, rootNode.left);
        }else if(rootNode.left == null && rootNode.right != null){ //왼쪽 자식 노드는 없고 오른쪽 자식 노드만 있으면
            makeNodeList(list, rootNode.right); //오른쪽 노드를 루트 노트 삼아서 다시 탐색
        }
    }

아래는 디스커션 정답을 참고해서 정리한 코드. 넘나 깔끔쓰.

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<Integer>();
        makeNodeList(list, root);
        return list;
    }
    
      public void makeNodeList(List<Integer> list, TreeNode rootNode){
        if(rootNode == null){
            return;
        }
        makeNodeList(list, rootNode.left);
        list.add(rootNode.val);
        makeNodeList(list, rootNode.right);
    }
}

아래는 가장 메모리 사용이 적은 코드. 아 나도 깔끔하게 생각해내고 싶다 ㅠ_ㅠ

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        //recursive way
        List<Integer> results = new ArrayList<>();
        helper(results, root);
        
        return results;
    }
    
    private void helper(List<Integer> results, TreeNode node) {
        if(node == null) {
            return;
        }        
        
        if(node.left != null) {
            helper(results, node.left);
        }
        results.add(node.val);
        if(node.right != null) {
            helper(results, node.right);
        }
    }
    
}
728x90
반응형

'TIL > Coding Test' 카테고리의 다른 글

[LeetCode] Roman to Integer  (2) 2021.03.13
[LeetCode] Path Sum  (2) 2021.03.11
[LeetCode] Reverse String  (0) 2021.03.09
[LeetCode] Divisor Game  (0) 2021.03.09
[LeetCode] Fibonacci Number  (2) 2021.03.08