树的非递归三种遍历
此文章用来做记忆的,所以直接给代码了:
先序遍历
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> ans(0);
if(root == nullptr)
return ans;
s.push(root);
while(!s.empty())
{
TreeNode* temp = s.top();
s.pop();
ans.push_back(temp->val);
if(temp->right != nullptr)
{
s.push(temp->right);
}
if(temp->left != nullptr)
{
s.push(temp->left);
}
}
return ans;
}
中序遍历
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> ans(0);
if(root == nullptr)
return ans;
s.push(root);
while(s.top()->left != nullptr)
{
s.push(s.top()->left);
}
while(!s.empty())
{
TreeNode* temp = s.top();
ans.push_back(temp->val);
s.pop();
if(temp->right != nullptr)
{
s.push(temp->right);
while(s.top()->left != nullptr)
{
s.push(s.top()->left);
}
}
}
return ans;
}
后序遍历
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
stack<int> s1;
vector<int> ans(0);
if(root == nullptr)
return ans;
s.push(root);
while(!s.empty())
{
TreeNode* temp = s.top();
s.pop();
s1.push(temp->val);
if(temp->left != nullptr)
{
s.push(temp->left);
}
if(temp->right != nullptr)
{
s.push(temp->right);
}
}
while(!s1.empty())
{
ans.push_back(s1.top());
s1.pop();
}
return ans;
}
|