1.题目描述
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3] 1 2 / 3 输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2.解法一:递归
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> preorderTraversal(TreeNode* root) { //先判空(最简洁的写法) if(root){ res.push_back(root->val); preorderTraversal(root->left); preorderTraversal(root->right); } return res; } private: vector<int> res; };
3.解法二:非递归(栈)
栈的作用:
- 1.逆序:abc输入,cba输出;
- 2.路径的回溯:a-->b-->c-->d,特别是树的深度优先遍历,也是这道题的用处。(不分析太详细,给大脑留思考与想象的空间,这很重要。)
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; //使用stack stack<TreeNode*> stack; TreeNode* p = root; //综合整理出来的循环条件 while (p || !stack.empty()) { //if(p)的判断为关键点 if (p){ stack.push(p); res.push_back(p->val); p = p->left; } else{ p = stack.top(); stack.pop(); p = p->right; } } return res; } };