給定乙個二叉樹,編寫乙個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(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位有符號整數的表示範圍內。
求二叉樹的最大寬度即求每一層的最左邊結點和最右邊結點之間的差的最大值,遍歷的內容其實是每一層的每個結點(這個結點相當於最右邊結點),所以要用乙個陣列儲存每一層最左邊結點的下標index,對於乙個man二叉樹深度為n的一層,共有2^(n-1)個結點,下標從1~2^(n-1)。而由二叉樹的性質可知:下標為index的結點的左右孩子的下標分別為2*index和2*index+1,這一點可以用來遍歷。
遞迴開始時,depth為1,index為1,若遍歷的結點為空,直接返回;若不空,先判斷depth是否大於start陣列的大小,如果大於,則證明當前的結點是下一層的新結點而且為最左結點,將它push_back入start陣列,該元素下標為start[depth-1];這之後,取res和index-start[depth-1]+1的最大值更新res,再遍歷左孩子和右孩子遞迴算每一層的最大寬度,以此類推。
/**
* definition for a binary tree node.
* struct treenode
* };
*/class solution
void dfs(treenode* root, vector& start, int depth, int index, int &res)
};
leetcode 662 二叉樹最大寬度
給定乙個二叉樹,編寫乙個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹 full binary tree 結構相同,但一些節點為空。每一層的寬度被定義為兩個端點 該層最左和最右的非空節點,兩端點間的null節點也計入長度 之間的長度。示例 1 輸入 1 3 2 5 3...
LeetCode662 二叉樹最大寬度
給定乙個二叉樹,編寫乙個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹 full binary tree 結構相同,但一些節點為空。每一層的寬度被定義為兩個端點 該層最左和最右的非空節點,兩端點間的null節點也計入長度 之間的長度。示例 1 輸入 1 3 2 5 3...
Leetcode 662 二叉樹最大寬度 C
給定乙個二叉樹,編寫乙個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹 full binary tree 結構相同,但一些節點為空。每一層的寬度被定義為兩個端點 該層最左和最右的非空節點,兩端點間的null節點也計入長度 之間的長度。示例 1 輸入 1 3 2 5 3...