---
# System prepended metadata

title: 144. Binary Tree Preorder Traversal
tags: [LeetCode]

---

# 144. Binary Tree Preorder Traversal

遍歷二元樹有三種方式，包含前序、中序、後序。實作中又有divided & conquer、遞迴、迭代等方法，遞迴可能會有stack overflow的問題，所以這題主要會使用迭代的方式來撰寫。

撰寫此題前要先了解STACK的用法
```cpp=
#include <stack>
```
是一種LIFO的線性資料結構，其中有不同的fuction做支援， **push()** 在堆疊中加入一個元素， **pop()** 移除堆疊中最上層元素，若堆疊是空的就會出現runtime error， **top()** 取得最上層元素，若堆疊是空的就會出現runtime error， **size()** 看有幾個元素， **empty()** 看堆疊是否為空。

![](https://i.imgur.com/rbpuWMe.png)

## 題解

前序遍歷需要知道的是先走訪目前的節點在找左節點再來才是右節點，如下圖所示:

![](https://i.imgur.com/vmsS40B.png)

理解完後直接來看此題程式碼
```cpp=
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode *root) {
        vector<int> result;
        if(!root)return result;
        
        stack<TreeNode *> st;
        st.push(root);
        while(st.size()>0){
            TreeNode * node = st.top();
            st.pop();
            result.push_back(node->val);
            if(node->right)st.push(node->right);
            if(node->left)st.push(node->left);
        }
        return result;
    }
};
```
算法流程

第 1 步：創建一個空Stack st並將根節點添加到其中。//stack<TreeNode *> st;

第 2 步：執行以下操作，直到 Stack 變空。

a) 從Stack中彈出並印出一個項目。
TreeNode * node = st.top();
st.pop();
result.push_back(node->val);
![](https://i.imgur.com/qve9C2Z.png)
![](https://i.imgur.com/gBDQ8BF.png)

b) 將彈出項目的右子項推入Stack。
if(node->right)st.push(node->right);

c) 將彈出項的左子項推入Stack。
if(node->left)st.push(node->left);
![](https://i.imgur.com/Vdf7yuW.png)

為確保首先處理左子樹，將右子樹推到左子樹之前，因為stack是 LIFO 數據結構。

後面比較需要想像，因為要保持左邊先出去，所以要把右邊先放進去。

###### tags: `LeetCode`