이진 트리 수준 순서 순회

10662 단어 javascriptleetcode
이진 트리의 루트가 주어지면 해당 노드 값의 레벨 순회를 반환합니다. (즉, 왼쪽에서 오른쪽으로, 레벨별로).

예 1:

입력: 루트 = [3,9,20,null,null,15,7]
출력: [[3],[9,20],[15,7]]

해결 방법 1: 별도의 행을 유지한 다음 행을 수평으로 밀어 넣습니다.

const levelOrder = (root) => {
  // BFS Level Order
  // Learning this method will help with all level order problems, graphs and trees

  if (!root) return []; // Edge case if root is null

  // First we have a queue intialized with the root
  let q = [root];
  let res = []; // our result array

  while (q.length) {
    // BFS continues till the queue is empty
    const len = q.length; // We need a helper variable for our inner level for loop, this helps us only process for this level

    // This loop is for processing all queue items on each LEVEL of the tree
    const levelArray = []; // Used to hold all values from this level
    for (let i = 0; i < len; i++) {
      const n = q.shift(); // We get first item in queue
      levelArray.push(n.val); // Push node value to the levelArray

      // We need to queue up all the children of the current node, if they exist
      n.left && q.push(n.left);
      n.right && q.push(n.right);
      // The above is the same as:
      // if(n.left) q.push(n.left)
    }

    // Once we process all nodes for this level, push levelArray to result array
    res.push(levelArray);
  }

  return res;
};



해결 방법 2: 동일한 배열 수준 유지 및 기본적으로 비어 있음 및 빈 수준에서 요소 푸시

/**
 * 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[][]}
 */
var levelOrder = function(root) {
 if (!root) return [];
  let queue = [root];
  let levels = [];
  while (queue.length > 0) {
    let levelSize = queue.length;
    levels.push([]);
    for (let i = 0; i < levelSize; i++) {
      let curr = queue.shift();
     levels[levels.length - 1].push(curr.val);

      if (curr.left) queue.push(curr.left);
      if (curr.right) queue.push(curr.right);
    }
  }

  return levels;
};


솔루션 3: 재귀를 통해

var levelOrder = function(root) {
    let result = [];
    let level = 0;
    const readNode = function(node, level) {
        if (!node) return;
        if (!result[level]) {
            result.push([node.val]);
        } else {
            result[level].push(node.val);
        }
        readNode(node.left, level + 1);
        readNode(node.right, level + 1);
    }
    readNode(root, level);
    return result;
};

좋은 웹페이지 즐겨찾기