【LeetCode刷題(中等程度)】662. 二叉樹最大寬度
給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(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;
}
};
相關文章
- 【LeetCode刷題(中等程度)】946. 驗證棧序列LeetCode
- LeetCode 刷題—樹LeetCode
- leetcode 刷題視訊(5) - 二叉樹與圖LeetCode二叉樹
- JavaScript實現-LeetCode刷題-【對稱二叉樹】-第101題!!!JavaScriptLeetCode二叉樹
- LeetCode每日一題:二叉樹的最大深度(No.104)LeetCode每日一題二叉樹
- LeetCode654. 最大二叉樹LeetCode二叉樹
- LeetCode 104.二叉樹的最大深度LeetCode二叉樹
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- Leetcode刷題筆記 501. 二叉搜尋樹中的眾數LeetCode筆記
- 【Leetcode刷題篇】leetcode152 乘積最大陣列LeetCode陣列
- 二叉樹的右檢視 (中等)二叉樹
- 【LeetCode刷題(困難程度)】132. 分割回文串 IILeetCode
- [Golang]力扣Leetcode—初級演算法—樹—二叉樹的最大深度Golang力扣LeetCode演算法二叉樹
- LeetCode 124. 二叉樹中的最大路徑和 | PythonLeetCode二叉樹Python
- 【刷題筆記】LeetCode-53 最大子陣列和筆記LeetCode陣列
- Leetcode刷題628. 三個數的最大乘積LeetCode
- leetcode 每日一題 617 合併二叉樹LeetCode每日一題二叉樹
- 【Leetcode千題】617. 合併二叉樹LeetCode二叉樹
- 2020.12.21-2020.12.27 leetcode刷題總結(拓撲排序&蓄水池抽樣&二叉搜尋樹&線段樹)LeetCode排序
- 程式碼隨想錄演算法訓練營第十四天|leetcode226. 翻轉二叉樹、leetcode101.對稱二叉樹、leetcode104.二叉樹的最大深度、leetcode111.二叉樹的最小深度演算法LeetCode二叉樹
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 程式碼隨想錄演算法訓練營第十七天|leetcode654. 最大二叉樹、leetcode617.合併二叉樹、leetcode700.二叉搜尋樹中的搜尋、leetcode98.驗證二叉搜尋樹演算法LeetCode二叉樹
- LeetCode刷題記63-109. 有序連結串列轉換二叉搜尋樹【檢視解法】LeetCode
- LeetCode每日一題: 翻轉二叉樹(No.226)LeetCode每日一題二叉樹
- LeetCode題144. 二叉樹的前序遍歷LeetCode二叉樹
- Leetcode 題解系列 -- 對稱二叉樹(遞迴)LeetCode二叉樹遞迴
- [LeetCode 中等 動態規劃 ]221. 最大正方形LeetCode動態規劃
- LeetCode 對稱二叉樹LeetCode二叉樹
- LeetCode題解(Offer26):判斷二叉樹A是否為二叉樹B的子樹(Python)LeetCode二叉樹Python
- LeetCode刷題 堆LeetCode
- LeetCode刷題整理LeetCode
- leetcode刷題(一)LeetCode
- 【Leetcode刷題篇】leetcode812 最大三角形面積LeetCode
- 二叉樹的最大/最小深度二叉樹
- 二叉樹的最大深度20201231二叉樹
- 刷題系列 - Python判斷是否映象對稱二叉樹Python二叉樹
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 每日一道演算法題--leetcode 124--二叉樹中的最大路徑和--python演算法LeetCode二叉樹Python