采用c++
//测试用例:AB##CD##EF##G##
#include<stdio.h>
#include<stack>
#include <vector>
#include <queue>
using namespace std;
typedef struct Node {
char data;
struct Node* lchild;
struct Node* rchild;
}TreeNode, *Tree;
void creatTree(Tree* T);
void xianxu(Tree T);
void zhongxu(Tree T);
void houxu(Tree T);
void zhongxu2(Tree T);
void qianxu2(Tree T);
void houxu2(Tree T);
void cengci(Tree T);
void cengci2(Tree T);
void aixing();
void cengcilianshi(Tree* T);
Tree createTree2(int n, int iq, int iz);
int qian[1000];
int zhong[1000];
int main(void)
{
Tree T = NULL;
int choice;
printf("由题目要求得,需要创建链式存储方法需要两个方法,请选择:\n\n1.前序构造,并使用#代表没有(左右)孩子,例如:AB##CD##EF##G## \n\n2.前序和中序构造,例如:\n7\nBADCFEG\nABCDEFG\n\n请输入你的选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
getchar();
printf("请按照前序输入一个二叉树(无左右孩子使用#表示):");
creatTree(&T);
break;
case 2:
int n;
char t;
printf("\n采用前序和中序构造链式存储(请输入一个二叉树的中序与前序):\n");
printf("请输入个数:");
scanf("%d", &n);
printf("中序:");
getchar();
for (int i = 0; i < n; i++)
{
scanf("%c", &t);
zhong[i] = t-'A'+1;
}
printf("\n前序:");
getchar();
for (int i = 0; i < n; i++)
{
scanf("%c", &t);
qian[i] = t - 'A'+1;
}
T = createTree2(n, 0, 0);
break;
default:
printf("\n输入错误");
exit(0);
}
printf("\n\n---------------");
printf("--------------");
printf("\n| 递归算法 |");
printf(" 非递归算法 |");
printf("\n---------------");
printf("--------------");
printf("\n|前序: |");
xianxu(T);
printf("|前序:|");
qianxu2(T);
printf("|\n|中序: |");
zhongxu(T);
printf("|中序:|");
zhongxu2(T);
printf("|\n|后续: |");
houxu(T);
printf("|后续:|");
houxu2(T);
printf("|\n-----------------------------");
printf("\n| 层次遍历 ");
printf("|\n---------------");
printf("\n|递归 |");
cengci(T);
printf("|\n|非递归|");
cengci2(T);
printf("|\n---------------");
aixing();
return 0;
}
//构造二叉树链式存储(先序)
void creatTree(Tree* T)
{
char c;
scanf("%c", &c);
if (c == '#')
{
T = NULL;
return;
}
if ((*T) == NULL)
(*T) = (Tree)malloc(sizeof(TreeNode));
(*T)->data = c;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
creatTree(&((*T)->lchild));
creatTree(&((*T)->rchild));
}
void xianxu(Tree T)
{
if (T != NULL)
{
printf("%c", T->data);
xianxu(T->lchild);
xianxu(T->rchild);
}
}
void zhongxu(Tree T)
{
if (T != NULL)
{
zhongxu(T->lchild);
printf("%c", T->data);
zhongxu(T->rchild);
}
}
void houxu(Tree T)
{
if (T != NULL)
{
houxu(T->lchild);
houxu(T->rchild);
printf("%c", T->data);
}
}
void qianxu2(Tree T)
{
stack<Tree>s;
Tree p;
s.push(T);
while (!s.empty())
{
while ((p = s.top()))
{
printf("%c", p->data);
s.push(p->lchild);
}
s.pop();
if (!s.empty())
{
p = s.top();
s.pop();
s.push(p->rchild);
}
}
}
void zhongxu2(Tree T)
{
stack<Tree>s;
Tree p;
s.push(T);
while (!s.empty())
{
while ((p = s.top())) s.push(p->lchild);
s.pop();
if (!s.empty())
{
p = s.top();
s.pop();
printf("%c", p->data);
s.push(p->rchild);
}
}
}
void houxu2(Tree root) {
Tree p = root;
Tree r = NULL;
stack<Tree> s;
while (p || !s.empty()) {
if (p) {//走到最左边
s.push(p);
p = p->lchild;
}
else {
p = s.top();
if (p->rchild && p->rchild != r)//右子树存在,未被访问
p = p->rchild;
else {
s.pop();
printf("%c", p->data);
r = p;//记录最近访问过的节点
p = NULL;//节点访问完后,重置p指针
}
}//else
}//while
}
//层次递归
void cengci(Tree T)
{
queue<Tree> q;
Tree p;
q.push(T);
while (!q.empty())
{
p = q.front();
q.pop();
printf("%c", p->data);
if (p->lchild != NULL)
q.push(p->lchild);
if (p->rchild != NULL)
q.push(p->rchild);
}
}
void cengci2(Tree T)
{
queue<Tree> q;
Tree p;
q.push(T);
while (!q.empty())
{
p = q.front();
q.pop();
printf("%c", p->data);
if (p->lchild != NULL)
q.push(p->lchild);
if (p->rchild != NULL)
q.push(p->rchild);
}
}
void aixing()
{
float a, x, y;
for (y = 1.5f; y > -1.5f; y -= 0.1f)
{
for (x = -1.5f; x < 1.5f; x += 0.06f)
{
a = x * x + y * y - 1;
char ch[3];
if (a * a * a - x * x * y * y * y <= 0.0f)
{
strcpy(ch, "月");
}
else
strcpy(ch, " ");
printf("%s", ch);
}
printf("\n");
}
}
//中序前序构造链式存储
Tree createTree2(int n, int iq, int iz)
{
if (n <= 0)
return NULL;
Tree T = (Tree)malloc(sizeof(TreeNode));
T->lchild = NULL;
T->rchild = NULL;
int i = 0;
T->data = char(qian[iq]-1+'A');
for (i = 0; zhong[i + iz] != qian[iq]; i++);
T->lchild = createTree2(i, iq + 1, iz);
T->rchild = createTree2(n - i - 1, iq + i + 1, iz + i + 1);
return T;
}
运行测试: