创建二叉树
前序遍历 递归与非递归
中序遍历 递归与非递归
后序遍历 递归与非递归
typedef struct BNode
{
char val;
BNode *left;
BNode *right;
}*Btree;
Btree CreateTree(Btree T)
{
char ch = getchar();
if (ch == '#')
T = NULL;
else
{
T = (Btree)malloc(sizeof(BNode));
T->val = ch;
T->left = CreateTree(T->left);
T->right = CreateTree(T->right);
}
return T;
}
void PreOrder(Btree T)//递归
{
if (T != NULL)
{
cout << T->val << ", ";
PreOrder(T->left);
PreOrder(T->right);
}
}
void PreOrder_01(Btree T)//非递归--前序遍历
{
stack<Btree> st;
Btree p=T;
while (p != NULL || !st.empty())
{
while (p != NULL)
{
cout << p->val << ",";
st.push(p);
p = p->left;
}
if (!st.empty())
{
p = st.top();
st.pop();
p = p->right;
}
}
}
void MidOrder(Btree T)//中序遍历--递归
{
if (T != NULL)
{
MidOrder(T->left);
cout << T->val << " ,";
MidOrder(T->right);
}
}
void MidOrder_01(Btree T)//中序遍历--非递归
{
Btree p = T;
stack<Btree> st;
while (p != NULL || !st.empty())
{
while (p != NULL)
{
st.push(p);
p = p->left;
}
if (!st.empty())
{
p = st.top();
cout << p->val << ",";
st.pop();
p = p->right;
}
}
}
void PostOrder(Btree T)
{
if (T != NULL)
{
PostOrder(T->left);
PostOrder(T->right);
cout << T->val << ",";
}
}
void main()
{
Btree T = NULL;
T= CreateTree(T);
PreOrder(T);
cout << endl;
PreOrder_01(T);
cout << endl;
MidOrder(T);
cout << endl;
MidOrder_01(T);
cout << endl;
PostOrder(T);
cout << endl;
}
void PostOrder_01(Btree T)
{
stack<pair<Btree, bool>> st;
Btree p = T;
while (!st.empty() || p != NULL)
{
if (p != NULL)
{
st.push(make_pair(p, false));
p = p->left;
}
else
{
if (st.top().second == false)
{
st.top().second = true;
p = st.top().first->right;
}
else
{
cout << st.top().first->val << " ";
st.pop();
}
}
}
}