ref : Tree Traversals (Inorder, Preorder and Postorder)
pre-order
順序 : parent -> left -> right, 從top -> bottom
適用於要先決定好parent才可以決定child。
1->2->4->5->3
in-order
順序 : left child -> parent -> right child, 從bottom ->top
4->2->5->1->3
在binary search tree(BST)中,使用inorder可以得到由小到大的排序。
post-order
順序 : left child -> right child -> parent, 從bottom -> top
適用於要先決定好child才可以決定parent
4->5->2->3->1
level-order(BFS)
給定一個target,找出在BST中是否有兩個node加起來為target。
想法:
給一個binary tree只輸出最右邊的value。典型的level-order traversal。
給你一個用preorder排序過的vector,根據這個vector重建binary tree。
- 第一個數值一定是root
- 因為binary tree的特性是右邊的數值一定大於root,所以找出比第一個數值大的分界點。
- 利用recursive來產生左右邊的sub-tree。
ps: 可以用使只傳遞上下邊界來改善效能。
給你兩個binary tree, 如果位置一樣的node兩個tree都有,就把node的數值相加,不然就是取有的那個node。
- 重複使用node,避免新增node。
- 把數值都往root1加。
- 取root->left或root->right的時候,要先判斷root是否為null。
給你一個binary tree,找出任一node和parent最大的差值。
- 不是一個BST,所以最大最小值不是最頂點的node。
- 因為差值是取abs,所以必須紀錄最大最小值。
給你兩個binary tree(root, subRoot),判斷root中是否有subtree和subRoot一樣。
- 問題如果是問兩顆tree一不一樣,問題就簡單多了,只要用下面的isSameTree()來判斷。
- 但是問題是問在root中的subtree,所以尋訪整個tree,如果第一的node數值一樣,就使用isSameTree()來判斷是不是一樣。
給你一個binary,從root到leaf可以表示成一個binary數值,求出所有binary數值的和。
- 所有進入helper()退出來的時候必須把原本加進去的數值退掉。
給你一個binary tree和兩個node(p, q)。找出p, q共同最低的祖先node。
- 如果root為共同的祖先,則可以在左半邊和右半邊找到p或q。
- 如果root不為共同祖先,則只會在一邊找到p和q,另一邊找不到。那就往non-null的那邊繼續找。
2022/07/05
- 為什麼這題是使用post-order?
- 因為我必須先知道child的狀態,才可以決定parent是不是LCA。
2024/02/09
還是參考了之前的解答。
一台camera可以看到自己和上下的node,試問最少的camera可以覆蓋所有的node。
- 一個node有三種狀態,放置camera,有被camera監視,沒有被camera監視。
- 如果top-down,就必須考慮node的所有可能,還要根據root node狀態推斷child node可能的狀態,比較困難。
- 如果bottom-up的話,因為bottom狀態確定了,比較容易推斷root node的狀態,所以使用bottom-up。
- 既然是bottom-up,就是post-order,先走訪到最底部才開始判斷前一個的狀態。
列出一個binary tree每個level最右邊node的數值。
- 使用preorder traversal,但是先走訪右邊再走訪左邊。因為我們想要先拿到右邊的node。
- 使用level來記錄目前走到的level,因為每一層只有一個right-most node,所以當rtn.size() < level我們才紀錄。
判斷binary tree是否為balanced。balanced的定義為從root來看左子樹和右子樹的高度差不為1。
- 因為要先知道左右兩邊的高度,所以為post-order。
- 得到兩邊子樹的高度之後,如果不是balanced那就不需要再判斷直接回傳-1。
- 如果兩邊差大於1也是回傳-1。
- 最後回傳計算後的高度。
找到在binary tree中的path剛好總合為target。這邊的path的定義是從parent到child。不會有child->parent->child的路徑。
- 每個node都可以為起始點,所以使用line 13, line 14,把path總和算是每個node的起點。
- 使用helper來計算以root為起點的path總和。
- 在helper中經過的每個node都為終點,所以計算總合。line 3。
- 如果以這個點的總和為target則加1,line 4。
- 繼續統計以root->left和root->right為終點的path。line 5,6。
- 因為有line 13, 14,所以不必計算單點是否等於target。
找出tree中,最長的path其中每兩個相鄰的node的char都不一樣。
- 一開始使用了DFS結果TLE。
- 參考了lee215大的解法,發現這題和124. Binary Tree Maximum Path Sum蠻像的。
- 應該說只要是在tree中找path應該都是一樣的套路。
- path至少會有一個node,
- 兩個以上的node就是會跟child連在一起。
- 有可能跟一個child連在一起,也有可能跟兩個child連在一起。
- 如果是跟兩個child連在一起。那一定是最長的兩個child。
- why preorder? 因為必須先知道每個child最長的path。
- 根據s[cur] != s[child],才可以判斷要不要取用這條path。所以判斷必須在pre-order之後。
- 回傳只能傳回node + 最長的child。
給你一個TreeNode* root,試判斷是否為complete binary tree。
- 一開始一直在想到底是要用pre-order, in-order或是post-order,就是忘了想用level order。
- 另一個解法是把每個node都給上一個value,最後排序這個vector但是會int overflow。
- 根據 complete binary tree的特性,如果我用level order traversal,就不會在node之前先遇到nullptr。
- 如果是complete binary tree最後的queue內容都會是nullptr。
binary tree中每個node都有不同的coins,找出最少的移動可以使每個node都有一個coin。
- 參考官方解答。
- why post-order traversal?
- 必須知道需要往child移動多少的coins,或是必須知道要從child移動多少coins上來parent。
- 正數表示child有多的coins必須移動上來。
- 負數表示child有少,必須從parent動到child。
- 因為child移動到child都要經過parent,所以可以視為多的先從child移動到parent,parent再分配給child。
- 也就是parent是一個中央統籌單位,多的coins先交給中央parent,再由中央parent分配給不夠的child。
- 如果整體來說還是不夠,中央parent再跟更上面的parent要求更多的coins。
- 如果分配完了還有多出來,中央parent再把剩下的往更上的parent繳交出去。
每個node除了0之外,都要往node 0前進,每前進一個node需要1L fuel。一台車子最多有seats個椅子。試問,最少的fuel來讓所有的node都達到node 0。
- 如果有n個人,則需要多少台車子? 使用無條件進位ceil。
- 所以使用post-order,因為要到達最後的leaf node,再往node 0前進,推算有多少個node在後面。
- 使用vector<int> vis來記錄訪問過的node。
- 為什麼統計每個node的車子數,就是統計需要的fuel?
leetcode
刷題