1. 程式人生 > >LeetCode662 二叉樹最大寬度

LeetCode662 二叉樹最大寬度

給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(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位有符號整數的表示範圍內。

 


 

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
演算法思想:
    迭代的方法,採用層序遍歷,注意這裡使用了佇列queue來輔助運算,queue裡存的是一個pair,包括結點和其當前位置。在進入新一層的迴圈時,首先將首結點的位置儲存出來當作最左位置,然後對於遍歷到的結點,都更新右結點的位置,遍歷一層的結點後來計算寬度更新結果res。
*/ //演算法實現: class Solution { public: int widthOfBinaryTree(TreeNode* root) { if (!root) return 0; int res = 0; queue<pair<TreeNode*,int>> q; //包括結點和其當前位置的佇列型別 q.push({root, 1}); while (!q.empty()) { int begin = q.front().second, end = 0, n = q.size(); //每層首結點位置,尾結點位置,結點個數 for (int i = 0; i < n; ++i) { //遍歷一層 TreeNode* t = q.front().first; //當前結點 end = q.front().second; //當前結點位置 q.pop(); if (t->left) //如果左子樹存在,end*2 q.push({t->left, end * 2}); if (t->right) //如果右子樹存在,end*2+1 q.push({t->right, end * 2 + 1}); } res = max(res, end - begin + 1); //求每層的寬度最大值 } return res; } };