二叉樹是每個結點最多有兩個子樹的樹結構。
3
/ \4 5
/ \1 2
因為二叉樹的左右子樹都具有類似的結構,二叉樹的題目往往和遞迴是關聯的。
遍歷二叉樹的每乙個點,通常有三種方式,中序,前序,後序的方式,對應上圖的樹來說,結果是:
3 4 1 2 5 // 前序
1 4 2 3 5 // 中序
1 2 4 5 3 // 後序
前、後、中都是相對於根節點的位置來定義的。
首先來看:
94. 二叉樹的中序遍歷
深度優先
通過遞迴的方式很容易構造,關鍵在於如何選出遞迴結束的條件,比如當前節點是空值時,需要return
方法一:
class solution
void helper(treenode root)}}
方法二:
除了遞迴的方式,還有迭代法,迭代中序遍歷時,需要借助乙個棧,棧的功能是儲存上乙個節點,好讓處理完左子樹的時候,可以回頭訪問根節點,根據這個思路,我們可以在訪問開始前沿著左子樹一路訪問到null
,然後再訪問上乙個節點(此時可以看成根節點),最後再訪問右節點:
class solution else
}return list;}}
144. 二叉樹的前序遍歷
有了中序遍歷的基礎,前序遍歷的遞迴形式可以很容易的寫出來:
方法一:
class solution
void helper(treenode root)}}
方法二:
使用迭代法依然時要借助乙個棧來實現,這裡棧的功能和中序遍歷類似,都是要儲存上乙個節點,便於訪問完左子樹後再訪問右子樹。不同的是,訪問下乙個左節點之前,就需要把節點的值儲存到結果中去:
class solution else
}return res;}}
145. 二叉樹的後序遍歷
前序遍歷和後序遍歷之間的的關係:
前序遍歷順序為:根 -> 左 -> 右
後序遍歷順序為:左 -> 右 -> 根
前序遍歷的時候,每個節點的值都會插入到結果鍊錶的尾部,res.add(root.val)
如果每次都選擇插入到結果鍊錶的頭部,那麼遍歷順序會變為:右 -> 左 -> 根
此時轉換一下左右子樹的先後順序,就得到我們想要的結果:左 -> 右 -> 根
迭代法:
死磕二叉樹(二)
102.二叉樹的層序遍歷 二叉樹層序遍歷可以借助bfs的思想解決 class solution 拿到這個題目之後,首先看到返回的型別是乙個list 因此在構造返回結果的時候,結果也是按層進行新增的,也就是說,在處理的過程中需要儲存當前訪問的層。構造返回結果 list res new linkedli...
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...