题目描述:
在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:
- 行数 m 应当等于给定二叉树的高度。
- 列数 n 应当总是奇数。
- 根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
- 每个未使用的空间应包含一个空的字符串""。
- 使用相同的规则输出子树。
链接:https://leetcode-cn.com/problems/print-binary-tree
例如:
分析:该题主要是输出二叉树时,将树看成一个满二叉树,而没有的节点用""
表示,通过层数,即可计算得总共有多少个节点数。则:
- 先计算层数
- 得出节点数
- 找规律,得出子节点的位置应该在何处。
找规律:
代码:
class Solution {
public:
int High(TreeNode* root)//求高度
{
if(root == nullptr)
return 0;
int left = High(root->left) + 1;
int right = High(root->right) + 1;
return left > right ? left : right;
}
void PrintBinTree(TreeNode* root,int cur,int pos, int row,vector<vector<string>>& vv)//递归
{
//row:当前所在行
if(root == nullptr)
return;
int mid = (pos + cur) / 2;//插入位置
vv[row][mid] = to_string(root->val);//整数转换为字符
PrintBinTree(root->left,cur,mid,row + 1,vv);//左边
PrintBinTree(root->right,mid + 1,pos,row + 1,vv);//右边
}
vector<vector<string>> printTree(TreeNode* root) {
int high = High(root);//求高度
int number = (int)pow(2,high) - 1;//节点数
vector<vector<string>> vv(high,vector<string>(number,""));
PrintBinTree(root,0,number - 1,0,vv);//这里传入number - 1,是因为数组是从0下标开始的
return vv;
}
};