给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
solution1:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> preorderTraversal(TreeNode* root) { 13 vector<int>vec; 14 preorderTraversal(root,vec); 15 return vec; 16 } 17 void preorderTraversal(TreeNode* root,vector<int>&vec) 18 { 19 if(root!=nullptr) 20 { 21 vec.push_back(root->val); 22 preorderTraversal(root->left,vec); 23 preorderTraversal(root->right,vec); 24 } 25 } 26 };
solution2:
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> preorderTraversal(TreeNode* root) { 13 vector<int>vec; 14 TreeNode* p = root; 15 stack<TreeNode*>st; 16 while(p!=nullptr || !st.empty()) 17 { 18 while(p!=nullptr) 19 { 20 st.push(p); 21 vec.push_back(p->val); 22 p=p->left; 23 } 24 if(!st.empty()) 25 { 26 p = st.top(); 27 st.pop(); 28 p = p->right; 29 } 30 } 31 return vec; 32 } 33 };
思路:前序遍历一颗二叉树,即根→左→右,那么很明显会沿着根顺着左孩子而下,直到到达最底层的左孩子,那么接下来需要访问该节点的右孩子。