Print Binary Tree 輸出二叉樹
阿新 • • 發佈:2018-12-09
在一個 m*n 的二維字串陣列中輸出二叉樹,並遵守以下規則:
- 行數
m
應當等於給定二叉樹的高度。 - 列數
n
應當總是奇數。 - 根節點的值(以字串格式給出)應當放在可放置的第一行正中間。根節點所在的行與列會將剩餘空間劃分為兩部分(左下部分和右下部分)。你應該將左子樹輸出在左下部分,右子樹輸出在右下部分。左下和右下部分應當有相同的大小。即使一個子樹為空而另一個非空,你不需要為空的子樹輸出任何東西,但仍需要為另一個子樹留出足夠的空間。然而,如果兩個子樹都為空則不需要為它們留出任何空間。
- 每個未使用的空間應包含一個空的字串
""
。 - 使用相同的規則輸出子樹。
示例 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;
}
};