二叉树前序遍历
- 打印当前节点,将该节点入栈。如果该节点有左子树,访问左子树,重复此步骤,直到没有左子树。
- 访问栈顶元素的右孩子,并出栈。重复1的操作。
- 当栈为空且指针为空时,遍历结束。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> arr;
stack<TreeNode*> sa;
while(!sa.empty()||root){
while(root){
sa.push(root);
arr.push_back(root->val);
root=root->left;
}
if(!sa.empty())
{
root=sa.top()->right;
sa.pop();
}
}
return arr;
}
};
二叉树中序遍历
- 将当前节点入栈。如果有左孩子,访问左孩子,重复此步骤,直至没有左孩子。
- 打印栈顶元素,出栈,访问栈顶右孩子,重复步骤1。
- 当栈为空且指针为空时遍历结束。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> arr;
stack<TreeNode*> sa;
while(!sa.empty()||root){
while(root){
sa.push(root);
root=root->left;
}
if(!sa.empty())
{
arr.push_back(sa.top()->val);
root=sa.top()->right;
sa.pop();
}
}
return arr;
}
};
二叉树后序遍历
- 将当前节点入栈,清空该节点的标记。如果有左孩子,访问左孩子,重复此步骤,直至没有左孩子。
- 标记栈顶元素,访问栈顶元素的右孩子,重复1步骤。如果当前栈顶元素被标记过则打印栈顶元素并出栈,设置指针为空。
- 当栈为空且指针为空则遍历结束。
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> arr;
stack<TreeNode*> sa;
vector<int> maze;
while(!sa.empty()||root)
{
while(root)
{
sa.push(root);
maze.resize(sa.size()+1);
maze[sa.size()]=0;
root=root->left;
}
while(!sa.empty()&&maze[sa.size()]==1)
{
root=sa.top();
arr.push_back(root->val);
sa.pop();
root=NULL;
}
if(!sa.empty())
{
maze[sa.size()]=1;
root=sa.top()->right;
}
}
return arr;
}
};