题目描述
知识点
先序遍历迭代实现
结果
实现
码前思考
- 想必二叉树先序遍历的递归写法早就写烂了。所以尝试一些使用迭代的方法去写一下遍历;
- 迭代通常就是指循环,我们需要设置一个栈结构来模拟递归的调用。循环的条件就是栈不为空;
- 由于是先序遍历,所以假设我们现在要访问根结点
root
,那么访问完它之后,它就没有用了,不会保存在栈中,那么它的左右子树的信息一定要保存到栈中,不然后面就找不到它左右子树信息了; - 然后按照“遍历先左后右”和“栈结构的特征”,我们先将
root
的右子树入栈,再将root
的左子树入栈。
代码实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//题中说尝试使用迭代的方法
//所谓迭代就是循环,可以是for,也可以是while,都可以
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
if(root != NULL){
st.push(root);
}else{
return vector<int>();
}
//结果数组
vector<int> res;
//只要root不是NULL,也就是不是空,我们就进行push
while(!st.empty()){
TreeNode* cur = st.top();
st.pop();
res.push_back(cur->val);
if(cur->right!=NULL){
st.push(cur->right);
}
if(cur->left!=NULL){
st.push(cur->left);
}
}
return res;
}
};
码后反思
- 写的时候没有理清思路,看来清晰的思考是非常重要的,一定要把握遍历的性质进行解题,比如在这道题目里面就是要把握“根结点访问之后就没了,我们怎么保存它的左右子树信息,特别是右子树的信息?”;
- 忘了
vector
的使用方法了,如果是初始化vector
,可以有两种。如果是assign
操作只能是一种:vector(int nSize):创建一个vector,元素个数为nSize(可以不赋值) vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t ------------------------------------------------------------------ assign(int nSize,const t& t):赋值一个vector,元素个数为nSize,且值均为t