前言
做个笔记,方便日后查阅
全部是模板函数,c++语言
前序遍历
template <typename T>
void preOrder(node<T>* root, ostream& os)
{
stack<node<T>*> st;
while(root != nullptr || !st.empty())
{
while(root != nullptr)
{
st.push(root);
os << root->data << '\t';
root = root->left;
}
if(!st.empty())
{
root = st.top()->right;
st.pop();
}
}
os << endl;
中序遍历
template <typename T>
void midOrder(node<T>* root, ostream& os)
{
stack<node<T>*> st;
while(root != nullptr || !st.empty())
{
while(root != nullptr)
{
st.push(root);
root = root->left;
}
if(!st.empty())
{
os << st.top()->data << '\t';
root = st.top()->right;
st.pop();
}
}
os << endl;
}
后序遍历
template <typename T>
void posOrder(node<T>* root, ostream& os)
{
stack<node<T>*> st;
vector<bool> tag;
while(root != nullptr || !st.empty())
{
while(root != nullptr)
{
st.push(root);
tag.push_back(false);
root = root->left;
}
while(!st.empty() && tag.at(st.size() - 1))
{
os << st.top()->data << '\t';
st.pop();
tag.pop_back();
}
if(!st.empty())
{
tag.at(st.size() - 1) = true;
root = st.top()->right;
}
}
os << endl;
}
注意,后序遍历根节点要访问两次才能出栈,所以有一伴随vector,记录是否访问了两次。