Keshawn_lu's Blog

Leetcode 655. 输出二叉树

字数统计: 540阅读时长: 2 min
2022/08/22 Share

题目简介:

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

  • 树的 高度height ,矩阵的行数 m 应该等于 height + 1
  • 矩阵的列数 n 应该等于 $2^{height+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

示例 1:

print1-tree

1
2
3
4
输入:root = [1,2]
输出:
[["","1",""],
["2","",""]]

提示:

  • 树中节点数在范围 [1, 2^10]
  • -99 <= Node.val <= 99
  • 树的深度在范围 [1, 10]

思路:

首先求出树的高度,然后创建相应的数组。

根据深度优先搜索,每次将结点放置到对应位置上即可。

tip:

  • height从0开始算起

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:

int tree_height(TreeNode* root){

if(!root)
return -1; //注意是-1不是0

return max(tree_height(root -> left), tree_height(root -> right)) + 1;
}

void dfs(vector<vector<string>>& res, int row, int col, int height, TreeNode* root){

res[row][col] = to_string(root -> val);

if(root -> left)
dfs(res, row + 1, col - pow(2, height - row - 1), height, root -> left);

if(root -> right)
dfs(res, row + 1, col + pow(2, height - row - 1), height, root -> right);
}

vector<vector<string>> printTree(TreeNode* root) {

int height = tree_height(root);

int m = height + 1;
int n = pow(2, height + 1) - 1;

vector<vector<string>> res(m, vector<string>(n, ""));

dfs(res, 0, (n - 1) / 2, height, root); //对应位置的行与列

return res;
}
};
CATALOG
  1. 1. 题目简介:
  2. 2. 思路:
  3. 3. 代码如下: