Print Binary Tree 输出二叉树

在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则:

  1. 行数 m 应当等于给定二叉树的高度。
  2. 列数 n 应当总是奇数。
  3. 根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。根节点所在的行与列会将剩余空间划分为两部分(左下部分和右下部分)。你应该将左子树输出在左下部分,右子树输出在右下部分。左下和右下部分应当有相同的大小。即使一个子树为空而另一个非空,你不需要为空的子树输出任何东西,但仍需要为另一个子树留出足够的空间。然而,如果两个子树都为空则不需要为它们留出任何空间。
  4. 每个未使用的空间应包含一个空的字符串""
  5. 使用相同的规则输出子树。

示例 1:

输入:
     1
    /
   2
输出:
[["", "1", ""],
 ["2", "", ""]]

示例 2:

输入:
     1
    / \
   2   3
    \
     4
输出:
[["", "", "", "1", "", "", ""],
 ["", "2", "", "", "", "3", ""],
 ["", "", "4", "", "", "", ""]]

示例 3:

输入:
      1
     / \
    2   5
   / 
  3 
 / 
4 
输出:
[["",  "",  "", "",  "", "", "", "1", "",  "",  "",  "",  "", "", ""]
 ["",  "",  "", "2", "", "", "", "",  "",  "",  "",  "5", "", "", ""]
 ["",  "3", "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]
 ["4", "",  "", "",  "", "", "", "",  "",  "",  "",  "",  "", "", ""]]

注意: 二叉树的高度在范围 [1, 10] 中。

思路:观察样例我们可以发现两个规律,最后生成的答案一定是个矩形,矩形的宽等于树的高h,矩形的长等于2^h-1,其实就是1+2+4+8...的一个等比数列,那么我们可以先初始化出这样一个二维的数组,然后向里面填数就可以了。填数也是有规律的,我们每次填的位置都是相对自己所在区间的中点,对于第一行而言,就是中点mid,这里记左端点为l=0,右端点为r=2^h-1,那么mid=(l+(r-l)/2)刚好是中点,对于第二行左子树而言,区间变为[l,mid-1],我们依然在该区间中点填写值,第二行右子树而言,区间为[mid+1,r],依然为区间中点填写值,所以这是一个递归的过程,一直到最后一层的空节点返回即可。

参考代码:

/**
 * 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:
int getHeight(TreeNode* root) {
	if (!root) return 0;
	return max(getHeight(root->left), getHeight(root->right)) + 1;
}
int getWidth(TreeNode* root) {
	if (!root) return 0;
	return max(getWidth(root->left), getWidth(root->right)) * 2 + 1;
}
void printTreeHelp(vector<vector<string>> &res, TreeNode* root,int l,int r,int level) {
	if (!root) return;
	int mid = l + (r - l) / 2;
	res[level][mid] = to_string(root->val);
	printTreeHelp(res, root->left, l, mid - 1, level + 1);
	printTreeHelp(res, root->right, mid+1, r, level + 1);
}
vector<vector<string>> printTree(TreeNode* root) {
	int h = getHeight(root), w = getWidth(root);
	vector<vector<string>> res(h, vector<string>(w, ""));
	printTreeHelp(res, root, 0, w - 1, 0);
	return res;
}
};

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/82711386
今日推荐