#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int ElementType;
typedef struct BiTNode//定义树的结构体
{
ElementType data;
struct BiTNode *left;
struct BiTNode *right;
}BiTNode,*BiTree;
BiTree createBT(int *ino,int* pre,int n)
{
BiTree b;
int *p;
int k;
if (n<=0)//若是空树
{
return NULL;
}
b = (BiTree) malloc(sizeof(BiTNode));//给树b开辟存储空间
b->data = *pre;//根节点
for (p=ino;p<ino+n;p++)
{
if (*p==*pre)
{
break;
}
}
k = p - ino;//确定根节点在中序遍历中的位置 k是根节点的位置
b->left= createBT(ino,pre+1,k);
b->right= createBT(p+1,pre+k+1,n-k-1);
return b;
}
BiTree Reverse(BiTree T)//交换左右孩子
{
if (T==NULL)
{
return NULL;
}
BiTree B;
B =(BiTree) malloc(sizeof(BiTNode));
B = T->left;//B作为中间变量
T->left = T->right;
T->right = B;
Reverse(T->left);//递归调用
Reverse(T->right);
return T;
}
void LevelTraversal(BiTree T)//层次遍历用数组实现。
{
int inside = 0;
int out = 0;
BiTree temp[101];//数组指针(数组里存的都是指针),来存各个结点。
temp[inside++] = T;
while (inside>out)
{
if (temp[out])
{
if(out!=0)
{
printf(" ");
}
printf("%d",temp[out]->data);
temp[inside++] = temp[out]->left;//感觉也是模拟了队列。
temp[inside++] = temp[out]->right;
}
out++;
}
}
int main()
{
int N;//二叉树中结点个数
scanf("%d",&N);
int ino[30];
int pre[30];
BiTree T = NULL;
for (int i=0;i<N;i++)//中序遍历序列
{
scanf("%d",&ino[i]);
}
for (int i=0;i<N;i++)
{
scanf("%d",&pre[i]);//前序遍历序列
}
T=createBT(ino,pre,N);
Reverse(T);
LevelTraversal(T);
}
天梯赛L2玩转二叉树
最新推荐文章于 2023-04-11 09:04:14 发布