1. 程式人生 > 其它 >超出 int64_t 最大範圍_解LeetCode第662題:二叉樹最大寬度

超出 int64_t 最大範圍_解LeetCode第662題:二叉樹最大寬度

技術標籤:超出 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;
    }
};

提交結果:

9473c1e59152dc3cebec50f667f7a28d.png

參考

  1. ^https://leetcode-cn.com/problems/maximum-width-of-binary-tree/solution/ceng-ci-bian-li-shi-xian-by-aaron_yu/
  2. ^https://leetcode-cn.com/problems/maximum-width-of-binary-tree/solution/yi-ceng-ceng-bian-ma-hou-bian-li-zhu-yi-bian-hao-y/