#include <stdio.h>
#include <stdlib.h>
/*二叉树的镜像 利用递归的思想实现*/
/*树的结构体*/
typedef struct Tree{
int data;
struct Tree *LeftTree;
struct Tree *RightTree;
}Tree;
/*序列结构体*/
typedef struct List{
int data[10];
int size;
}List;
/*重建二叉树 根据 前序序列 和 中序序列 */
Tree *rebuildTree(List *preList,List *midList)
{
/*判断中序序列*/
if(midList->size == 0) return NULL;
Tree *root = NULL;
/*判断前序序列*/
if(preList->size != 0)
{
/*创建根节点 并进行初始化*/
root = (Tree*)malloc(sizeof(Tree));
/*前序序列的第一个元素就是二叉树的根节点*/
root->data = preList->data[0];
}
int i=0,j=0;
int leader=0;/*存放每次 中序序列集合中 的根节点*/
for(i=0;i<midList->size;i++)
{
/*确定第一次,根节点在中序序列中的位置*/
if(midList->data[i] == preList->data[0])
{
leader = i; /*获得了 本次 根节点 在 中序序列 中的位置*/
break;
}
}
/*分别定义存放 前序序列 和 中序序列 的 左子树集合 和 右子树集合 的 结构体变量*/
List pre_left,pre_right,mid_left,mid_right;
/* 初始化 */
pre_left.size = pre_right.size = mid_left.size = mid_right.size = 0;
/*根据变量leader(根节点在中序节点的位置),给前序节点和中序交接点的 左子树集合 赋值*/
for(i=0;i<leader;i++)
{
pre_left.data[i] = preList->data[i+1];
pre_left.size++;
mid_left.data[i] = midList->data[i];
mid_left.size++;
}
/*给前序节点和中序交接点的 右子树集合 赋值*/
for(i=leader+1,j=0;i<midList->size;i++,j++)
{
pre_right.data[j] = preList->data[i];
pre_right.size++;
mid_right.data[j] = midList->data[i];
mid_right.size++;
}
/*借助递归调用,重建二叉树*/
/*递归调用将左子树看成完整的一棵树找出根结点作为主根结点的左子树*/
root->LeftTree = rebuildTree(&pre_left,&mid_left);
/*递归调用将右子树看成完整的一棵树找出根结点作为主根结点的右子树*/
/*注意是 root->rightTree */
root->RightTree = rebuildTree(&pre_right,&mid_right);
return root;
}
/*前序递归遍历二叉树*/
void pre_travel(Tree *tree)
{
if(tree)
{
printf("%d ",tree->data);
pre_travel(tree->LeftTree);
pre_travel(tree->RightTree);
}
}
/*镜像*/
void turn_tree(Tree *tree)
{
if(tree)
{
Tree * tep;
tep = tree->RightTree;
tree->RightTree = tree->LeftTree;
tree->LeftTree = tep;
turn_tree(tree->LeftTree);
turn_tree(tree->RightTree);
}
}
int main(void)
{
Tree *tree;
List preList,midList;
preList.size = midList.size = 0;
int i=0,num=0;
printf("List len \n");
scanf("%d",&num);
/*创建前序序列*/
printf("请输入前序序列:\n");
for(i=0;i<num;i++)
{
scanf("%d",& preList.data[i]) ;
preList.size++;
}
/*创建中序序列*/
/*创建中序序列*/
printf("请输入中序序列:\n");
for (i = 0; i < num; i++){
scanf(" %d", &midList.data[i]);
midList.size++;
}
/*调用重建二叉树函数*/
tree = rebuildTree(&preList,&midList);
/*前序遍历*/
pre_travel(tree);
printf("\n");
/*镜像*/
turn_tree(tree);
/*前序遍历*/
pre_travel(tree);
return 0;
}
二叉树的镜像 (C语言)
最新推荐文章于 2024-03-12 13:44:45 发布