React

102. Binary Tree Level Order Traversal

Medium
Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
Example 1:
Input: root = [3,9,20,null,null,15,7] Output: [[3],[9,20],[15,7]]
Plain Text
복사
Example 2:
Input: root = [1] Output: [[1]]
Plain Text
복사
Example 3:
Input: root = [] Output: []
Plain Text
복사
Constraints:
The number of nodes in the tree is in the range [0, 2000].
1000 <= Node.val <= 1000

My solution

Input: root = [3,9,20,null,null,15,7] Output: [[3],[9,20],[15,7]]
JavaScript
복사
같은 레벨의 노드들은 배열 안에 모아둔다.
레벨 오더 방식은 이미 구현해봤는데 반복문이라서 재귀로 아래와 같이 구현했다.
const lvOrder = (function () { let count = 0; let answer = []; function lvOrderTraverse(focusNode, k) { if (focusNode != null) { console.log(count === k, '#', focusNode.val); lvOrderTraverse(focusNode.left, k); lvOrderTraverse(focusNode.right, k); } } return function (root, k) { count = 0; answer = []; lvOrderTraverse(root); return answer; }; })();
JavaScript
복사
(i.e., from left to right, level by level).
class Tree { constructor() { this.root = null this.levelSort = [] } levelTravers = (currentNode, level) => { if (currentNode === null) return if (this.levelSort[level] === undefined || level === 0) this.levelSort.push([]) if (typeof currentNode.val === 'number') { this.levelSort[level].push(currentNode.val) this.levelTravers(currentNode.left, level + 1) this.levelTravers(currentNode.right, level + 1) return } } } const levelOrder = (root) => { const myTree = new Tree() myTree.root = root myTree.levelTravers(myTree.root, 0) return myTree.levelSort }
JavaScript
복사
그냥 리트코드에서 작성을 했다.
갑자기 뜬금없는 값들이 나온다. 입력이랑 관련없는 값인 걸 보니 함수가 계속 그대로 존재해서 그 변수가 덮어씌워진 것 같다. 자유변수 answer를 사용할 때마다 새로 초기화해줘야겠다고 생각해서 19번라인을 추가했다.
콘솔한개를 지우니 괜찮은 성능이 나왔다.
좀 아쉬운 부분이 배열이었는지 보고 2가지로 나눠서 만들어주는 부분인데 이게 배열인지 아닌지 확인하지 않고도 할 수 있다면 좀더 개선되지 않을까 싶다.
const lvOrder = (function () { let answer = []; function levelOrderTraverse(focusNode, L) { if (focusNode != null) { if (Array.isArray(answer[L])) { answer[L].push(focusNode.val); } else { answer[L] = [focusNode.val]; }
JavaScript
복사
아무리 봐도 이상해서 push를 일단 없애보려고 노력했다. 왜냐하면 push는 원본배열을 수정해버리는 mutator method이므로 함수형 프로그래밍에서 지양해야했기 때문에 스프레드연산자로 해결할 수 있는 방식이 떠올라 아래와 같이 바꾸었더니 좋은 성능이 나왔다. 97%보다 빠른 걸 보니 놀라웠다.
answer[L] =answer[L]? [...answer[L], focusNode.val]:[focusNode.val];
JavaScript
복사
앞의 answer[L]이 배열로 존재하지 않는 경우 접근했을 때 undefined가 나오기 때문에 이 경우에는 배열에 val를 그대로 넣어서 할당하고 만약 이미 배열로 존재하면 스프레드연산자로 push를 대체했다.
다시 한번 리팩토링한 덕분에 엄청난 성능 향상을 얻을 수 있었다. 앞으로도 이런 연습을 많이 해서 자연스럽게 할 수 있도록 해야겠다. ㄷ

소스코드

const lvOrder = (function () { let answer = []; function levelOrderTraverse(focusNode, L) { if (focusNode != null) { answer[L] = answer[L] ? [...answer[L], focusNode.val] : [focusNode.val]; levelOrderTraverse(focusNode.left, L + 1); levelOrderTraverse(focusNode.right, L + 1); } } return (node, L) => { answer = []; levelOrderTraverse(node, L); return answer; }; })(); /** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right = (right===undefined ? null : right) * } */ /** * @param {TreeNode} root * @return {number[][]} */ const levelOrder = function (root) { return lvOrder(root, 0); };
JavaScript
복사