1.前序遍历
通过栈来模拟递归,先将根节点放进栈,循环条件为栈不为空,每次将栈顶弹出并加入结果数组,若不为空则将其右节点入栈,左节点入栈,这样是因为栈先进后出,保证左节点先出栈。
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> ans;
ans.push(root);
while(!ans.empty())
{
TreeNode *node=ans.top();
ans.pop();
if(node==NULL)
continue;
res.push_back(node->val);
ans.push(node->right);
ans.push(node->left);
}
return res;
}
2.中序遍历
中序遍历与先序后续都不相同,要将节点访问与节点处理分开进行,创建指针指向根节点,循环条件为指针或栈不为空,若节点不为空则将指针指向左节点,为空则将指针指向栈顶并将栈顶弹出,同时将栈顶数据存入结果数组,再将指针指向右节点。
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> ans;
TreeNode* node=root;
while(node!=NULL||!ans.empty())
{
if(node!=NULL)
{
ans.push(node);
node=node->left;
}
else
{
node=ans.top();
res.push_back(node->val);
ans.pop();
node=node->right;
}
}
return res;
}
2.后序遍历
先序遍历为根左右,后序遍历为左右根,将先序遍历左右节点进栈顺序更换则变为根右左,再将得到的结果数组反转为左右根,即为后序遍历。
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> ans;
ans.push(root);
while(!ans.empty())
{
TreeNode *node=ans.top();
ans.pop();
if(node==NULL)
continue;
res.push_back(node->val);
ans.push(node->left);
ans.push(node->right);
}
reverse(res.begin(),res.end());
return res;
}