#include <iostream>
#include <stdio.h>
#include<stack>
using namespace std;
typedef struct Node
{
char data;
struct Node *left;
struct Node *right;
}*pNode;
//建立二叉树
void create_tree(pNode &pRoot)
{
char ch;
scanf("%c",&ch);
if(ch=='.')
{
pRoot = NULL;
}
else
{
pRoot = new Node();
pRoot->left = NULL;
pRoot->right = NULL;
if(!pRoot)
return ;
pRoot->data = ch;//给T赋值
create_tree(pRoot->left);//给左子树赋值
create_tree(pRoot->right);//给右子树赋值
}
}
void pre_show(Node *pRoot)//递归前序遍历二叉树
{
if(pRoot)
{
std::cout<<pRoot->data<<" ";
pre_show(pRoot->left);
pre_show(pRoot->right);
}
}
void pre_show_ex(Node* pRoot)//非递归前序遍历
{
std::stack<Node*> ve;
pNode tmp = pRoot;
while(tmp || !ve.empty())
{
while(tmp)//显示当前节点信息,遍历该节点左子树
{
std::cout<<tmp->data<<" ";
ve.push(tmp);
tmp = tmp->left;
}
if(!ve.empty())//回退当前节点到右子树
{
tmp = ve.top();
ve.pop();
tmp = tmp->right;
}
}
}
void mid_show(Node *pRoot)//中序遍历二叉树
{
if(pRoot)
{
mid_show(pRoot->left);
std::cout<<pRoot->data<<" ";
mid_show(pRoot->right);
}
}
void mid_show_ex(Node* pRoot)//非递归中序遍历
{
std::stack<Node*> ve;
pNode tmp = pRoot;
while(tmp || !ve.empty())
{
while(tmp)//遍历该节点左子树
{
ve.push(tmp);
tmp = tmp->left;
}
if(!ve.empty())//显示当前节点信息,回退当前节点到右子树
{
tmp = ve.top();
ve.pop();
std::cout<<tmp->data<<" ";
tmp = tmp->right;
}
}
}
void back_show(Node *pRoot)//后序遍历二叉树
{
if(pRoot)
{
back_show(pRoot->left);
back_show(pRoot->right);
std::cout<<pRoot->data<<" ";
}
}
void back_show_ex(Node* pRoot)//非递归后序遍历
{
std::stack<Node*> ve;
pNode tmp = pRoot;
pNode flag = NULL;
while(tmp || !ve.empty())
{
while(tmp)//遍历该节点左子树入栈
{
ve.push(tmp);
tmp = tmp->left;
}
if(!ve.empty())
{
tmp = ve.top();
if(tmp->right == NULL || flag == tmp->right)//如果没有右子树,或已经被访问过,则输出当前节点,并出栈
{
std::cout<<tmp->data<<" ";
flag = tmp;
tmp = NULL;
ve.pop();
}
else//否则指向右子树
tmp = tmp->right;
}
}
}
int main()
{
Node *pRoot;
std::cout<<"输入一串字符,子树为空,用.来代替"<<std::endl;
create_tree(pRoot);
std::cout<<"make btree ok"<<std::endl;
std::cout<<"pre oreder result :";
pre_show(pRoot);
std::cout<<std::endl<<"pre oreder result--ex :";
pre_show_ex(pRoot);
std::cout<<std::endl<<"mid oreder result :";
mid_show(pRoot);
std::cout<<std::endl<<"mid oreder result-ex :";
mid_show_ex(pRoot);
std::cout<<std::endl<<"back oreder result :";
back_show(pRoot);
std::cout<<std::endl<<"back oreder result——ex :";
back_show_ex(pRoot);
std::cout<<std::endl;
return 0;
}