#include<iostream>
using namespace std;
enum Tag { link, thread };
typedef struct Bitree
{
char sign;
int data;
Bitree* left;
Bitree* right;
Tag ltag;
Tag rtag;
}bi_node;
void cre_tree(bi_node* &node);
void pre_display(bi_node*);
void in_display(bi_node*);
void post_display(bi_node*);
void pre_cueing(bi_node*);
void in_cueing(bi_node*);
void pre_traversal(bi_node* node);
void in_traversal(bi_node* node);
bi_node* pre;
int main()
{
cout << "输入序列以创建二叉树:(如AB#D##C##)\n";
char signs = getc(stdin);
ungetc(signs, stdin);
bi_node* tree = NULL;
cre_tree(tree);
cout << "二叉树创建成功!";
cout << "\n前序遍历:" << endl;
pre_display(tree);
cout << "\n中序遍历:" << endl;
in_display(tree);
cout << "\n后序遍历:" << endl;
post_display(tree);
pre = NULL;
pre_cueing(tree);
cout << "\n先序线索化完成!" << endl;
cout << "先序遍历线索化树:" << endl;
pre_traversal(tree);
cout << "\n创建一棵新二叉树:" << endl;
getchar();
char new_signs = getchar();
ungetc(new_signs, stdin);
bi_node* new_tree = NULL;
cre_tree(new_tree);
pre = NULL;
in_cueing(new_tree);
cout << "中序线索化完成!" << endl;
cout << "中序遍历线索化树:" << endl;
in_traversal(new_tree);
}
void cre_tree(bi_node* &node)
{
char ch = getc(stdin);
if (ch == '#')
{
node = NULL;
return;
}
else
{
node = new bi_node;
node->sign = ch;
node->ltag = node->rtag = link;
cre_tree(node->left);
cre_tree(node->right);
}
}
void pre_cueing(bi_node* node)
{
if (node == NULL)
return;
if (node->left == NULL)
{
node->ltag = thread;
node->left = pre;
}
if (pre!=NULL && pre->right == NULL)
{
pre->rtag = thread;
pre->right = node;
}
pre = node;
if (node->ltag == link)
pre_cueing(node->left);
if (node->rtag == link)
pre_cueing(node->right);
}
void in_cueing(bi_node* node)
{
if (node == NULL)
return;
in_cueing(node->left);
if (node->left == NULL)
{
node->left = pre;
node->ltag = thread;
}
if (pre != NULL && pre->right == NULL)
{
pre->rtag = thread;
pre->right = node;
}
pre = node;
in_cueing(node->right);
}
void pre_traversal(bi_node* node)
{
while (node)
{
cout << node->sign;
if (node->rtag == thread)
node = node->right;
else if (node->left != NULL&&node->ltag!=thread)
node = node->left;
else
node = node->right;
}
}
void in_traversal(bi_node* node)
{
while (node)
{
while (node->left != NULL&&node->ltag==link)
node = node->left;
cout << node->sign;
while (node->rtag == thread )
{
node = node->right;
cout << node->sign;
}
node = node->right;
}
}
void pre_display(bi_node* node)
{
if (node == NULL)
return;
cout << node->sign;
pre_display(node->left);
pre_display(node->right);
}
void in_display(bi_node* node)
{
if (node == NULL)
return;
in_display(node->left);
cout << node->sign;
in_display(node->right);
}
void post_display(bi_node* node)
{
if (node == NULL)
return;
post_display(node->left);
post_display(node->right);
cout << node->sign;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术