【路飞】二叉树的右视图

72 阅读1分钟

题目:199. 二叉树的右视图

image.png

解法一

深度遍历:按照 根结点 -> 右子树 -> 左子树 的顺序访问,就可以保证每层都是最先访问最右边的节点的。

function rightSideView(root) {
  const list = [];
  const dfs = (node, level) => {
    if (!node) return;
    if (list.length === level) {
      list.push(node.val);
    }
    level++;
    dfs(node.right, level);
    dfs(node.left, level);
  };
  dfs(root, 0);
  return list;
}

解法二

广度遍历:利用 BFS 进行层次遍历,记录下每层的最后一个元素

function rightSideView(root) {
  if (!root) return [];
  const queue = [root];
  const list = [];
  while (queue.length) {
    const size = queue.length;
    for (let i = 0; i < size; i++) {
      const node = queue.shift();
      if (node.left) {
        queue.push(node.left);
      }
      if (node.right) {
        queue.push(node.right);
      }
      // 记录当前层的最后一个元素
      if (i == size - 1) {
        list.push(node.val);
      }
    }
  }
  return list;
}