這裡我們可以採用很多解法,比如單佇列、雙佇列、但更多的,我覺得採用遞迴思想,才是比較考驗思維功底的。
/**
* definition for a binary tree node.
* type treenode struct
*/func
maxlevelsum
(root *treenode)
int queue :=
*treenode
maxsum :=
0 level :=
0 res := level
forlen(queue)
>
0if v.right !=
nil}
// 保留當前節點和最大值的層
if maxsum < sum
// 指向子佇列
queue = newqueue
}return res
}
像這種,我覺得還是遞迴思想更加能得到鍛鍊,我現分享如下的兩種遞迴解法,僅供參考,具體請見注釋部分。
/**
蠻力演算法思路就是超級簡單,當然效率一般,因為很多步驟重複了:
1、計算樹有多少層。
2、計算每一層的和
3、從樹的根到葉,一層層求最大值
4、輸出最大值
*/func
mymax
(x, y int
)int
return y
}func
maxlevelsum
(root *treenode)
int sum :=
0 maxdepth :=
getmaxdepth
(root)
res :=
0for i:=
0; i
}return res+1}
// 計算深度
func
getmaxdepth
(root *treenode)
intreturn
mymax
(getmaxdepth
(root.left)+1
,getmaxdepth
(root.right)+1
)}// 計算單層的元素累積和
func
getlevelsum
(root *treenode, level int
)int
if level==
0return
getlevelsum
(root.left, level-1)
+getlevelsum
(root.right, level-1)
}
解法二:這種思路也很清晰,而且寫出的**優美不冗餘。
// 主要思想
// 為每一層維護乙個和值 rowsum,然後比較各層和最大值,將其輸出
// 具體看**注釋
func
maxlevelsum
(root *treenode)
int}
return maxlevel +1}
func
dfs(root *treenode, rowsum *
int, depth int
)// 只要是要入棧的元素大於它所在的深度,說明此時該層已經有元素了,
// 此時,來乙個,累加乙個,放在depth索引所在的位置。
// 我們只需要將其所在層的這些值挨個進行累加即可。
iflen
(*rowsum)
> depth
else
// 最後,分別對左右子樹進行遞迴吧
dfs(root.left, rowsum, depth+1)
dfs(root.right, rowsum, depth+1)
}
leetcode1161 最大層內元素和
給你乙個二叉樹的根節點 root。設根節點位於二叉樹的第 1 層,而根節點的子節點位於第 2 層,依此類推。請你找出層內元素之和 最大 的那幾層 可能只有一層 的層號,並返回其中 最小 的那個。示例 輸入 1,7,0,7,8,null,null 輸出 2 解釋 第 1 層各元素之和為 1,第 2 層...
遞迴演算法c 1161 最大層內元素和
題目 給你乙個二叉樹的根節點 root。設根節點位於二叉樹的第 1 層,而根節點的子節點位於第 2 層,依此類推。請你找出層內元素之和 最大 的那幾層 可能只有一層 的層號,並返回其中 最小 的那個。1 70 7 8輸入 1,7,0,7,8,null,null 輸出 2 解釋 第 1 層各元素之和為...
陣列內兩個元素的最大差
2016京東商場校園招聘筆試題 問題描述 無序陣列array,找到陣列中兩個數的最大差值,且大數出現在小數之後,如 arr i arr j 且 i比如 array 是 2,3,10,6,4,8,1 最大差值是8 2 10 方法1 依次訪問陣列中的每乙個元素 1 記錄當前訪問過的陣列中的最小值 min...