附上題目連結
題目:給定一棵樹,求出透過postorder traversal的值
postorder探討:首先我們要先拜訪左邊的節點,之後拜訪右邊的節點,最後拜訪根(父)節點,同樣透過維基百科的圖片進行解說。
以此圖來說,它的postorder traversal是1-->4-->7-->6-->3-->13-->14-->10-->8,首先從8開始,有左節點,持續往左到1,1沒有左右節點,為第一個,回到3,3有右節點6,6有左節點4,4為第二個,4沒有左右節點,回到6,6有右節點7,7為第三個,7沒有左右節點,回到6,6是第四個,接著回到3,3是第五個,回到8,8有右節點10,10有右節點14,14有左節點13,13沒有左右節點因此為第六個,回到14,14為第七個,回到10,10為第八個,最後回到第九個8,結束遍歷。
虛擬碼(表達概念,不同程式語言要考慮其語法轉換)
postorderTraversal(Tree t){
if(t==null)return;
else{
postorderTraversal(t.left);//追蹤左節點
postorderTraversal(t.right);//追蹤右節點
print(t.val);//印出根節點的值(如果有要儲存值可以改成list.add(t.val))
}
}
在此題當中,我會使用一個List來儲存樹的資料並運用遞迴概念來進行回傳
附上程式碼以及說明
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> l=new ArrayList<>();//儲存node的值
public List<Integer> postorderTraversal(TreeNode root) {
if(root==null){return l;}//如果root為空值,直接回傳
postorderTraversal(root.left);//追蹤左節點
postorderTraversal(root.right);//追蹤右節點
l.add(root.val);//儲存root的值
return l;//回傳
}
}