Leetcode 두 갈래 나무 네 가지 반복 방식 총결산

기사 목록

  • 1. 앞차례가 두루 다니다
  • 2. 중서가 두루 다니다
  • 3. 뒷차례가 두루 다니다
  • 4. 층층이 두루 다니다

  • 1. 앞의 순서를 두루 훑어보다


    Leetcode 144. 두 갈래 나무의 앞 순서가 두루 다니다
    반복 구현:
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<>();
            helper(root, res);
            return res;
        }
    
        private void helper(TreeNode root, List<Integer> res) {
            if (root == null) {
                return;
            }
    
            res.add(root.val);
            helper(root.left, res);
            helper(root.right, res);
        }
    }
    

    반복 실현: 왼쪽 지점을 따라 전개하고 동시에 창고를 눌러 왼쪽 나무가 비어 있을 때까지 한다.창고 꼭대기 요소를 꺼내서 오른쪽 트리로 돌려 창고가 비어 있을 때까지 위 절차를 반복합니다.이 방법은 세 가지 반복 방식에 적용된다.
  • 현재 노드를 창고에 눌러 넣고 노드 값을 출력 서열(전번 반복)에 넣고 왼쪽 트리로 이동합니다
  • 왼쪽 나무가 비어 있을 때까지 반복 과정 1
  • 창고 꼭대기 요소를 팝업하고 노드 값을 출력 시퀀스(중차 반복)에 넣고 오른쪽 트리로 이동합니다
  • 창고가 비어 있을 때까지 반복 과정 1
  • class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<Integer> res = new ArrayList<>();
            Stack<TreeNode> stk = new Stack<>();
            while (true) {
                while (root != null) {
                    res.add(root.val);
                    stk.push(root);
                    root = root.left;
                }
                if (stk.isEmpty()) {
                    break;
                }
                TreeNode node = stk.pop();
                root = node.right;
            }
            return res;
        }
    }
    

    반복 실현: 매번 순환, 오른쪽 노드 선입 후출, 왼쪽 노드 후입 선출, 창고의 특성을 이용하여 반복을 완성하고 전차 반복에만 적용.
    class Solution {
        public List<Integer> preorderTraversal(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<Integer> res = new ArrayList<>();
            Stack<TreeNode> stk = new Stack<>();
            stk.push(root);
            while (!stk.isEmpty()) {
                TreeNode node = stk.pop();
                res.add(node.val);
                if (node.right != null) {
                    stk.push(node.right);
                }
                if (node.left != null) {
                    stk.push(node.left);
                }
            }
            return res;
        }
    }
    

    2.중서 반복


    Leetcode 94. 두 갈래 나무의 중서가 두루 다니다
    반복 구현:
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<>();
            helper(root, res);
            return res;
        }
    
        private void helper(TreeNode root, List<Integer> res) {
            if (root == null) {
                return;
            }
    
            helper(root.left, res);
            res.add(root.val);
            helper(root.right, res);
        }
    }
    

    반복 구현:
    class Solution {
        public List<Integer> inorderTraversal(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<Integer> res = new ArrayList<>();
            Stack<TreeNode> stk = new Stack<>();
            while (true) {
                while (root != null) {
                    stk.push(root);
                    root = root.left;
                }
                if (stk.isEmpty()) {
                    break;
                }
                TreeNode node = stk.pop();
                res.add(node.val);
                root = node.right;
            }
            return res;
        }
    }
    

    3. 뒤서다


    Leetcode 145. 두 갈래 나무의 뒤가 두루 다니다
    반복 구현:
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            List<Integer> res = new ArrayList<>();
            helper(root, res);
            return res;
        }
    
        private void helper(TreeNode root, List<Integer> res) {
            if (root == null) {
                return;
            }
    
            helper(root.left, res);
            helper(root.right, res);
            res.add(root.val);
        }
    }
    

    반복 실현: 후차 역주행은 역전차 역주행의 역주행 출력이다. 역전차 역주행은 루트 노드를 먼저 방문하고 오른쪽 트리를 처리하며 마지막으로 왼쪽 트리를 처리한다.
  • 앞의 순서 반복: 뿌리->왼쪽->오른쪽;
  • 역전서 역행: 뿌리->오른쪽->왼쪽;
  • 뒷차례 반복: 왼쪽->오른쪽->뿌리..
  • class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<Integer> res = new ArrayList<>();
            Stack<TreeNode> stk = new Stack<>();
            while (true) {
                while (root != null) {
                    res.add(root.val);
                    stk.push(root);
                    root = root.right;
                }
                if (stk.isEmpty()) {
                    break;
                }
                TreeNode node = stk.pop();
                root = node.left;
            }
            Collections.reverse(res);
            return res;
        }
    }
    

    반복 실현: 뒷차례 반복 중, 오른쪽 트리를 다 훑어봐야 루트 노드에 접근할 수 있습니다.따라서 변수를 도입하여 지난번 방문한 노드를 기록하여 오른쪽 트리에 대한 반복이 완료되었는지 판단해야 한다.
    class Solution {
        public List<Integer> postorderTraversal(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<Integer> res = new ArrayList<>();
            Stack<TreeNode> stk = new Stack<>();
            TreeNode pre = null;
            while (root != null) {
                pre = root;
                stk.push(root);
                root = root.left;
            }
            while (!stk.isEmpty()) {
                TreeNode node = stk.peek();
                if (pre == node.right || node.right == null) {
                    pre = stk.pop();
                    res.add(node.val);
                } else {
                    root = node.right;
                    while (root != null) {
                        pre = root;
                        stk.push(root);
                        root = root.left;
                    }
                }
            }
            return res;
        }
    }
    

    4. 겹겹이 훑어보기


    Leetcode 102. 두 갈래 나무의 층이 두루 다니다
    반복 구현:
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            List<List<Integer>> res = new ArrayList<>();
            helper(root, 0, res);
            return res;
        }
    
        private void helper(TreeNode root, int level, List<List<Integer>> res) {
            if(root == null) {
                return;
            }
            if(level == res.size()) {
                res.add(new ArrayList<>());
            }
            res.get(level).add(root.val);
            helper(root.left, level+1,res);
            helper(root.right,level+1,res);
        }
    }
    

    반복 구현:
    class Solution {
        public List<List<Integer>> levelOrder(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
    
            List<List<Integer>> res = new ArrayList<>();
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                int n = queue.size();
                List<Integer> ans = new ArrayList<>();
                for (int i = 0; i < n; i++) {
                    TreeNode node = queue.remove();
                    ans.add(node.val);
                    if (node.left != null) {
                        queue.add(node.left);
                    }
                    if (node.right != null) {
                        queue.add(node.right);
                    }
                }
                res.add(ans);
            }
            return res;
        }
    }
    

    좋은 웹페이지 즐겨찾기