思路:用栈模拟用递归执行的过程即可。
首先递归的代码如下;
void pre(TreeNode * root)
{
if(root == nullptr)
return ;
cout<<root->val<<" ";
pre(root -> left);
pre(root -> right);
}
递归就是通过栈来实现的。
其实每次输出节点的值后,剩下的pre(root -> left) pre(root-->right)就是相当于入栈。画出递归树知道递归的过程就可以知道入栈的顺序了。
不过注意的是改成入栈的时候得先把右节点入栈,然后再左节点入栈。因为栈是先进后出的
所以,当栈非空的时候,访问栈顶,并把栈顶弹出。把栈顶的右节点,左节点入栈。
/**
* Definition for binary tree
* 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) {
vector<int>res;
if(root == nullptr)
return res;
stack<TreeNode*>s;
s.push(root);
while(!s.empty() )
{
TreeNode * p = s.top();
res.push_back(p->val);//访问栈顶节点
s.pop();//弹出栈顶
//把栈顶的右节点和左节点入栈
if(p->right)
s.push(p->right);
if(p->left)
s.push(p->left);
}
return res;
}
};