# [144. Binary Tree Preorder Traversal](https://leetcode.com/problems/binary-tree-preorder-traversal/) # 思路 要求进行二叉树的前序遍历, 属于务必掌握的基本题目。 ## 思路一 递归 最简单的当然就是递归遍历了, 先遍历当前节点, 再递归遍历左子树, 再递归遍历右子树. 递归出口就是当前节点为空. ## 思路二 迭代 稍微难一点的就是迭代遍历. 这里一共有三种写法, 注意领会相互区别,关键点就是**右孩子比左孩子先入栈**。 # C++ ## 思路一 递归 ``` C++ class Solution { private: void helper(vector&res, TreeNode *root){ if(!root) return; res.push_back(root -> val); helper(res, root -> left); helper(res, root -> right); } public: vector preorderTraversal(TreeNode* root) { vector< int>res; helper(res, root); return res; } }; ``` ## 思路二 迭代 ### 写法一 ``` C++ class Solution { public: vector preorderTraversal(TreeNode* root) { vector res; if (!root) return res; stack stk{{root}}; // 注意这种初始化方法 TreeNode *p; while (!stk.empty()) { p = stk.top(); stk.pop(); res.push_back(p -> val); // 先访问 if(p -> right) stk.push(p -> right); // 再将右子树入栈 if(p -> left) stk.push(p -> left); } return res; } }; ``` ### 写法二 ``` C++ class Solution { public: vector preorderTraversal(TreeNode* root) { vectorres; if(!root) return res; TreeNode *p = root; stackstk; while(!stk.empty() || p){ if(!p){ // 向左下降不动了, 从栈顶pop元素 p = stk.top(); stk.pop(); } res.push_back(p -> val); if(p -> right) stk.push(p -> right); p = p -> left; } return res; } }; ``` ### 写法三 ``` C++ class Solution { public: vector preorderTraversal(TreeNode* root) { vectorres; if(!root) return res; TreeNode *p; stackstk; stk.push(root); while(!stk.empty()){ p = stk.top(); stk.pop(); while(p){ // 一路向左下降 res.push_back(p -> val); if(p -> right) stk.push(p -> right); p = p -> left; } } return res; } }; ```