超出 int64_t 最大範圍_解LeetCode第662題:二叉樹最大寬度
阿新 • • 發佈:2020-12-15
技術標籤:超出 int64_t 最大範圍
題目描述(難度中等)
給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(full binary tree)結構相同,但一些節點為空。
每一層的寬度被定義為兩個端點(該層最左和最右的非空節點,兩端點間的null節點也計入長度)之間的長度。
示例 1:
輸入: 1 / 3 2 / 5 3 9 輸出: 4 解釋: 最大值出現在樹的第 3 層,寬度為 4 (5,3,null,9)。
示例 2:
輸入:
1
/
3
/
5 3
輸出: 2
解釋: 最大值出現在樹的第 3 層,寬度為 2 (5,3)。
示例 3:
輸入:
1
/
3 2
/
5
輸出: 2
解釋: 最大值出現在樹的第 2 層,寬度為 2 (3,2)。
示例 4:
輸入: 1 / 3 2 / 5 9 / 6 7 輸出: 8 解釋: 最大值出現在樹的第 4 層,寬度為 8 (6,null,null,null,null,null,null,7)。
注意: 答案在32位有符號整數的表示範圍內。
解題思路[1]
將二叉樹的下標儲存到陣列中:
根節點下標為 1,左子樹結點為 2 * i,右子樹下標為 2 * i+1;然後我們層次遍歷,每次比較最大寬度值。
但是這個題目有個噁心的例子,全部節點都只有右子樹。按照上面的編碼,後面的編號就要爆炸。所以做一個優化就是每當對下一層的節點進行編號的時候,減去上一層最左邊的編號,這樣就可以保證編號不會超出題目要求的int的範圍。[2]
程式碼如下
/** * 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 widthOfBinaryTree(TreeNode* root) { int width=0; if(root==NULL)//邊界情況 return width; queue<pair<TreeNode*,int>> q; q.push(make_pair(root,1)); while(!q.empty()) { int size=q.size();//當前層非空節點數 int pos=q.front().second;//當前層第一個節點的編號 for(int i=0;i<size;i++) { pair<TreeNode*,int> p=q.front(); q.pop(); if(p.first->left) //減去pos是為了防止越界,這樣每層的編號都是從1開始 q.push(make_pair(p.first->left,p.second*2-pos)); if(p.first->right) q.push(make_pair(p.first->right,p.second*2+1-pos)); if(width<p.second-pos+1) width=p.second-pos+1; } } return width; } };
提交結果:
參考
- ^https://leetcode-cn.com/problems/maximum-width-of-binary-tree/solution/ceng-ci-bian-li-shi-xian-by-aaron_yu/
- ^https://leetcode-cn.com/problems/maximum-width-of-binary-tree/solution/yi-ceng-ceng-bian-ma-hou-bian-li-zhu-yi-bian-hao-y/