655 输出二叉树-中等
给你一棵二叉树的根节点 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) 链接:https://leetcode.cn/problems/print-binary-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
算法分析:
先构造结果集,然后逐层填充。
// date 2020/02/25
func printTree(root *TreeNode) [][]string {
depth := findDepth(root) // 行数
// 列数
length := 1 << depth - 1
res := make([][]string, depth)
for i := 0; i < depth; i++ {
res[i] = make([]string, length)
}
fill(res, root, 0, 0, length)
return res
}
func fill(res [][]string, t *TreeNode, i, l, r int) {
if t == nil {
return
}
res[i][(l+r)/2] = fmt.Sprintf("%d", t.Val)
fill(res, t.Left, i+1, l, (l+r)/2)
fill(res, t.Right, i+1, (l+r+1)/2, r)
}
func findDepth(root *TreeNode) int {
if root == nil {
return 0
}
l, r := findDepth(root.Left), findDepth(root.Right)
if l > r {
return l+1
}
return r+1
}
最后更新于