#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef struct BiTNode
{
char data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
int CreateBiTree(BiTree &T)
{
char data;
scanf_s("%c", & data);
if (data == '#')
{
T = NULL;
}
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return 0;
}
void Visit(BiTree T)
{
if (T->data != '#')
{
printf("%c ", T->data);
}
}
void PreOrder(BiTree T)
{
if (T != NULL)
{
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
void PreOrder2(BiTree T)
{
stack<BiTree> stack;
BiTree p = T;
while (p || !stack.empty())
{
if (p != NULL)
{
stack.push(p);
printf("%c ", p->data);
p = p->lchild;
}
else
{
p = stack.top();
stack.pop();
p = p->rchild;
}
}
}
void InOrder2(BiTree T)
{
stack<BiTree> stack;
BiTree p = T;
while (p || !stack.empty())
{
if (p != NULL)
{
stack.push(p);
p = p->lchild;
}
else
{
p = stack.top();
printf("%c ", p->data);
stack.pop();
p = p->rchild;
}
}
}
typedef struct BiTNodePost
{
BiTree biTree;
char tag;
} BiTNodePost, *BiTreePost;
void PostOrder2(BiTree T)
{
stack<BiTreePost> stack;
BiTree p = T;
BiTreePost BT;
while (p != NULL || !stack.empty())
{
while (p != NULL)
{
BT = (BiTreePost)malloc(sizeof(BiTNodePost));
BT->biTree = p;
BT->tag = 'L';
stack.push(BT);
p = p->lchild;
}
while (!stack.empty() && (stack.top())->tag == 'R')
{
BT = stack.top();
stack.pop();
BT->biTree;
printf("%c ", BT->biTree->data);
}
if (!stack.empty())
{
BT = stack.top();
BT->tag = 'R';
p = BT->biTree;
p = p->rchild;
}
}
}
void LevelOrder(BiTree T)
{
BiTree p = T;
queue<BiTree> queue;
queue.push(p);
while (!queue.empty())
{
p = queue.front();
printf("%c ", p->data);
queue.pop();
if (p->lchild != NULL)
{
queue.push(p->lchild);
}
if (p->rchild != NULL)
{
queue.push(p->rchild);
}
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("先序遍历:\n");
PreOrder(T);
printf("\n");
printf("先序遍历(非递归):\n");
PreOrder2(T);
printf("\n");
printf("中序遍历:\n");
InOrder(T);
printf("\n");
printf("中序遍历(非递归):\n");
InOrder2(T);
printf("\n");
printf("后序遍历:\n");
PostOrder(T);
printf("\n");
printf("后序遍历(非递归):\n");
PostOrder2(T);
printf("\n");
printf("层次遍历:\n");
LevelOrder(T);
printf("\n");
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话