【每日一题记录】655. 输出二叉树

68 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第22天,点击查看活动详情

大家好 我是短袖撸码蒂尔尼。今天带来的是一道在LeetCode上的题目,题目难度为中等。就在此为大家分享一下解答思路。

题目阐述

给你一棵二叉树的根节点 root ,请你构造一个下标从 0 开始、大小为 m x n 的字符串矩阵 res ,用以表示树的 格式化布局 。构造此格式化布局矩阵需要遵循以下规则:

树的 高度 为 height ,矩阵的行数 m 应该等于 height + 1 。 矩阵的列数 n 应该等于 2height+1 - 1 。 根节点 需要放置在 顶行 的 正中间 ,对应位置为 res[0][(n-1)/2] 。 对于放置在矩阵中的每个节点,设对应位置为 res[r][c] ,将其左子节点放置在 res[r+1][c-2height-r-1] ,右子节点放置在 res[r+1][c+2height-r-1] 。 继续这一过程,直到树中的所有节点都妥善放置。 任意空单元格都应该包含空字符串 "" 。 返回构造得到的矩阵 res 。

 

来源:力扣(LeetCode)

思路阐述

这个题目看着好像需要很强的数学观察能力,可是实际上,正应了那句古诗所云:不识庐山真面目,只缘身在此山中。题目已经把最难的左右节点位置规律公式告诉给了我们,因此,只需要建立好二维数据,运用好递归就行了。

代码展示

function printTree(root: TreeNode | null): string[][] {
  let height = getHeight(root, 0);
  let res = new Array(height + 1).fill("");
  for (let i = 0; i < res.length; i++)
    res[i] = new Array(Math.pow(2, height + 1) - 1).fill("");
  const row = 0;
  const col = (Math.pow(2, height + 1) - 1 - 1) / 2;
  res[row][col] = root.val + "";

  print(root.left, height, row + 1, col - Math.pow(2, height - row - 1), res);
  print(root.right, height, row + 1, col + Math.pow(2, height - row - 1), res);
  return res;
}
function getHeight(root: TreeNode | null, cur: number): number {
  if (!root || (!root.left && !root.right)) return cur;
  let left = getHeight(root.left, cur + 1);
  let right = getHeight(root.right, cur + 1);
  return left > right ? left : right;
}
function print(
  node: TreeNode,
  height: number,
  row: number,
  col: number,
  arr: any
) {
  if (node == null) return;
  arr[row][col] = node.val + "";
  print(node.left, height, row + 1, col - Math.pow(2, height - row - 1), arr);
  print(node.right, height, row + 1, col + Math.pow(2, height - row - 1), arr);
}

这里定义了三个函数:

函数名作用
printTree主函数,主要打印根节点
getHeight获取二叉树高度height(dfs)
print打印函数根据传入参数row col 给二维数组赋值并给子节点递归打印

注意的事项

  • 打印二叉树的时候打印值是字符串
  • 不需要考虑输入根节点为null的情况

image.png

我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!

名片.jpg