Skip to content

Commit 75aa83c

Browse files
committed
Add: Add binary tree post travel
1 parent 18d995c commit 75aa83c

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# 145. Binary Tree Postorder Traversal
2+
3+
Given the root of a binary tree, return the postorder traversal of its nodes' values.
4+
5+
## 基礎思路
6+
這題是經典的 Tree Traversal 題目,我們可以使用遞迴的方式來解決這個問題。
7+
遞迴的方式依序遍歷左子樹結果、右子樹結果,最後再加上根節點 (也可是子樹的"根"節點)。
8+
9+
## 解題步驟
10+
11+
### Step 1: 直接返回遞迴結果
12+
13+
```typescript
14+
return root ? [...postorderTraversal(root.left), ...postorderTraversal(root.right), root.val] : []
15+
```
16+
須注意由於 root 可能為 null,因此在遞迴的過程中,需要先判斷 root 是否為 null。(這也是遞迴的終止條件)
17+
然後把左子樹的結果展開,再把右子樹的結果展開,最後再加上根節點的值。
18+
19+
## 時間複雜度
20+
每個節點都會被訪問一次,因此時間複雜度為 $O(n)$。
21+
22+
> $O(n)$
23+
24+
## 空間複雜度
25+
* 最壞的情況下,遞迴的深度為 $O(n)$,最好的情況下,遞迴的深度為 $O(\log n)$。
26+
* 保存結果的空間複雜度為 $O(n)$。
27+
* 故總體空間複雜度為 $O(n)$。
28+
29+
> $O(n)$
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class TreeNode {
2+
val: number
3+
left: TreeNode | null
4+
right: TreeNode | null
5+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
6+
this.val = (val===undefined ? 0 : val)
7+
this.left = (left===undefined ? null : left)
8+
this.right = (right===undefined ? null : right)
9+
}
10+
}
11+
12+
function postorderTraversal(root: TreeNode | null): number[] {
13+
return root ? [...postorderTraversal(root.left), ...postorderTraversal(root.right), root.val] : []
14+
}

0 commit comments

Comments
 (0)