【LeetCode刷題(中等程度)】662. 二叉樹最大寬度

讀研的小狗子發表於2020-11-28

給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(full binary tree)結構相同,但一些節點為空。

每一層的寬度被定義為兩個端點(該層最左和最右的非空節點,兩端點間的null節點也計入長度)之間的長度。

示例 1:
在這裡插入圖片描述
輸出: 4
解釋: 最大值出現在樹的第 3 層,寬度為 4 (5,3,null,9)。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/maximum-width-of-binary-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

思路:給每個節點編號,根節點為1,如果當前節點有左孩子,那麼這個左孩子的值為2*cur->val,如果這個節點有右孩子,那麼這個右孩子對應的值為2*cur->val+1。但是在C++裡用Long值記錄會溢位。所以我們每一層都從1開始計數(只要減去上一層最後一個值就可以了)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int widthOfBinaryTree(TreeNode* root) {
        if(!root)
            return 0;
        queue<TreeNode*> q;
        root->val = 1;
        q.push(root);
        int ans = 0;
        while(!q.empty())
        {
            ans = max(q.back()->val - q.front()->val + 1,ans);
            int tmp = q.front()->val - 1;
            int size = q.size();
            for(int i = 0;i < size;++i)
            {
                TreeNode* cur = q.front();
                cur->val -= tmp;//減去上一層最後一個值
                if(cur->left)
                {
                    cur->left->val = 2*cur->val;
                    q.push(cur->left);
                }
                if(cur->right)
                {
                    cur->right->val = 2*cur->val +1;
                    q.push(cur->right);
                }

                q.pop();
            }
        }
        return ans;
    }
};

相關文章