깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • tree
  • Binary Tree(이진 트리)
  • Trie
  • TypeScript
  • POST / GET 요청
  • 점화식(Recurrence Relation)
  • 시간 복잡도
  • 코딩테스트 연습문제
  • BST(이진 탐색 트리)
  • 최대 힙(Max Heap)
  • Backtracking(백트래킹)
  • DFS(깊이우선탐색)
  • 최소 힙(Min Heap)
  • Leetcode
  • Til
  • leetcode-cli
  • 팀 프로젝트
  • 자바스크립트 기초 문법
  • 혼자 공부하는 자바스크립트
  • TIT (Today I Troubleshot)
  • Inorder Traversal(중위 순회)
  • 프로그래머스
  • 01. 미니 프로젝트
  • Linked List
  • 자잘한 에러 해결
  • 트러블 슈팅 Troubleshooting
  • BFS(너비우선탐색)
  • Preorder Traversal(전위 순회)
  • 자료 구조
  • 재귀 함수
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

TIL | WIL

9/26 (화) 이진 트리 후위 순회 구현 TIL

2023. 9. 26. 20:17

공부한 것

  • LeetCode #145. Binary Tree Postorder Traversal
    LeetCode - The World's Leading Online Programming Learning Platform
    Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
    https://leetcode.com/problems/binary-tree-postorder-traversal/description/

    후위 순회(Postorder traversal): ‘나’와 두 자식을 기준으로, “왼 자식 → 오른 자식 → 나” 순으로 순회하는 것.

    어제 구현한 중위 순회를 바탕으로 빠르게 풀 수 있었다. Iterative 방식으로 풀이 중에 오른쪽 자식을 처리하는 부분을 추가할 때 else if로 할지 왼쪽 자식과 함께 ‘자식이 존재하면’의 큰 if로 묶어줘야 하는지 고민했는데, else if로 괜찮았던 것으로.

    • 순회(iterative) 해답:
      // iterative solution
      function postorderTraversal1(root: TreeNode | null): number[] {
      	if (!root) return [];
      
      	const resultMap: Map<TreeNode, number> = new Map();
      	const stack: TreeNode[] = [root];
      
      	while (stack.length) {
      		// 지금 노드를 '본다'
      		const node = stack[stack.length - 1];
      		
      		// 왼쪽 노드가 있고 아직 '처리'하지 않았다면 왼쪽 자식을 스택에 추가한다. 
      		if (node.left && !resultMap.has(node.left)) stack.push(node.left);
      		// 그렇지 않고(?) 오른쪽 노드가 있고 아직 '처리'하지 않았다면 오른 자식을 스택에 추가한다. 
      		else if (node.right && !resultMap.has(node.right)) stack.push(node.right);
      		// 그렇지 않다면(양 자식이 없거나 모두 처리된 경우) 현재 노드를 스택에서 뽑고, result에 넣는다. 
      		else {
      			stack.pop();
      			resultMap.set(node, node.val);
      		}
      	}
      
      	return [...resultMap.values()];
      }
    • 재귀(recursive) 해답:
      // recursive solution
      function postorderTraversal2(root: TreeNode | null): number[] {
      	if (!root) return [];
      	return [...postorderTraversal2(root.left), ...postorderTraversal2(root.right), root.val];
      }


Uploaded by N2T

    'TIL | WIL' 카테고리의 다른 글
    • 9/28 (목) leetcode-cli를 해부 중2 TIL
    • 9/27 (수) leetcode-cli를 해부 중 TIL
    • 9/25 (월) 이진 트리 전위 순회와 중위 순회 구현하기 TIL
    • 9/22 (금) 단어 검색II 문제를 Trie로 업그레이드하다 TIL
    깊은바다거북
    깊은바다거북

    티스토리툴바