携手创作,共同成长!这是我参与「掘金日新计划 · 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 。
思路阐述
这个题目看着好像需要很强的数学观察能力,可是实际上,正应了那句古诗所云:不识庐山真面目,只缘身在此山中。题目已经把最难的左右节点位置规律公式告诉给了我们,因此,只需要建立好二维数据,运用好递归就行了。
代码展示
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) |
打印函数根据传入参数row col 给二维数组赋值并给子节点递归打印 |
注意的事项
- 打印二叉树的时候打印值是字符串
- 不需要考虑输入根节点为null的情况
我是短袖撸码蒂尔尼
一名热爱阿森纳的前端工程师
如果本文对您有帮助,可以给一个免费的赞吗?谢谢!