655. 输出二叉树
题目描述
在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:
1.行数 m 应当等于给定二叉树的高度。
2.列数 n 应当总是奇数。
3.根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
4.每个未使用的空间应包含一个空的字符串""。
5.使用相同的规则输出子树。
示例 1:
示例 2:
示例 3:
思路
1.先求出树的最大深度,根据最大深度初始化结果矩阵
2.DFS填充矩阵值
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<string>> printTree(TreeNode* root) {
int row = maxDepth(root);
int col = (1 << row) - 1;
vector<vector<string>> res(row,vector<string>(col,""));
int mid = 1 << (row - 1);
int c = col >> 1;
int r = 0;
dfs(root,mid,r,c,res);
return res;
}
void dfs(TreeNode* root, int mid, int row, int col, vector<vector<string>>& res){
if(root == NULL){
return;
}
res[row][col] = to_string(root->val);
mid >>= 1;
dfs(root->left,mid,row + 1,col - mid,res);
dfs(root->right,mid,row + 1,col + mid,res);
}
int maxDepth(TreeNode* root){
if(root == NULL){
return 0;
}
return 1 + max(maxDepth(root->left),maxDepth(root->right));
}
};
复杂度分析
时间复杂度:O(N)
空间复杂度:O(N)