進度:15/100
?
原題1:
給你一棵二叉樹的根節點?root
?,翻轉這棵二叉樹,并返回其根節點。
(力扣的圖)
原題2:
給定二叉樹的根節點?root
?,返回所有左葉子之和。
原題3:
給你一個二叉樹的根節點?root
?,按?任意順序?,返回所有從根節點到葉子節點的路徑。
葉子節點?是指沒有子節點的節點。
原題4:
給你一個二叉樹的根節點?root
?,判斷其是否是一個有效的二叉搜索樹。
有效?二叉搜索樹定義如下:
- 節點的左子樹
只包含?小于?當前節點的數。 - 節點的右子樹只包含?大于?當前節點的數。
- 所有左子樹和右子樹自身必須也是二叉搜索樹。
?
?
1.翻轉二叉樹--簡單
這次一反常態沒寫出遞歸寫出了迭代。
(1.迭代。每層每層反轉,x.right<-->x.left,若左右節點是存在的,就加入隊列。
(2.遞歸。有點抽象,自下而上翻轉二叉樹,因為葉節點反轉好就可以反轉子節點,而迭代是自上而下翻轉二叉樹。
?
?
2.左葉子之和--簡單
思路:
(1.遞歸。由于要計算的是“左”葉子之和,所以遞歸return的標志不應該是發現該節點為葉子節點然后貢獻給結果,而是發現當前節點的左子節點為葉子節點然后貢獻給結果。
(2.迭代。對于每個節點,若該節點的左節點是葉子節點,貢獻值;若不是葉子,加入棧中。對于右節點,若不是葉子節點,加入棧中。
?
?
3.二叉樹的所有路徑--簡單
思路:
(1.遞歸。感謝 to_string 救我于水火之中。
(2.迭代。感覺迭代的邏輯總是很強。用一個treenode隊列和一個string隊列來存當前到達節點和路徑,若該節點已經是葉子,就將路徑push進vector中,若不是,則分別判斷是否存在左子節點和右子節點,然后push進兩個隊列中。
學到寫法:q.push(path + "->" + to_string( root->left->val ));
?
?
4.驗證二叉搜索樹--中等
(1.遞歸。感覺官方題解的代碼好優美啊。從上往下遞歸的時候,函數帶有root,lower,upper,如果root的val不滿足大于lower或者小于upper,就return false,否則,繼續向下遍歷,遍歷左節點就將upper更新為root.val(因為對于左節點來說,root.val是比它大的最小數),右節點就更新lower為root.val(對于右節點來說,root.val是比它小的最大數)。
(2.迭代。我們用中序遍歷,那么該樹如果是二叉搜索樹,就一定是升序的。每次記錄最小值,然后將下一個值與最小值比較,如果小于最小值,就說明不是二叉搜索樹。我還是有點迷惑,可能本質上是因為我并沒有完全搞懂遍歷算法。
?