1. 程式人生 > >Print Binary Tree 輸出二叉樹

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;
}
};