二叉树基础操作(根据中序序列和后序序列确定二叉树)

标题根据中序序列和后序序列确定二叉树

一些基本的函数和初始化

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
	char data;
	struct Node* lchild;
	struct Node* rchild;
}Node ,*Root;

主函数

int main()
{
	Root BT;
	BT=union_pre_and_in();
	print_pre_order(BT);
	printf("\n");
	print_in_order(BT);
	printf("\n");
	print_post_order(BT);
	printf("\n");
	print_level_order(BT);
	printf("\n");
}

输入结点个数以及二叉树的中序和后序序列

Node* union_pre_and_in()
{    //我们以二叉树
//前序序列:ABDEGCFH
//中序序列:DBGEAFHC
//后序序列:DGEBHFCA
//层次遍历:ABCDEFGH
	Node* BT;
	char in[1000], post[1000];
	int k;
	printf("请输入结点个数:");
	scanf("%d", &k);
	scanf("%s", in);
	scanf("%s", post);
	BT=pre_and_in_create(in,post,k);
	return BT;
}

创建二叉树

Node* pre_and_in_create(char* in, char* post, int k)
{
	if (k > 0)//子树结点个数要大于零
	{
		Node* BT = (Node*)malloc(sizeof(Node));
		char* edge = in;
		//edge用来找到根节点在中序序列中的位置
		//edge把二叉树的序列分为左子树的中序序列和右子树的中序序列
		char* root_position = post + k - 1;
		//在后序序列中,子树的序列的最后一个结点是根节点
		//所以root_position存储根节点在后序序列中的位置
		//我们在中序序列中和后序序列中找到了根节点的位置
		//这有助于我们把问题分解成若干个小问题来解决
		BT->data = *root_position;
		while (*edge != *root_position)
		{
			edge++;
		}
		//从该子树的中序序列的第一个结点开始找根节点的位置
		BT->lchild = pre_and_in_create(in, post, edge - in);
		//从中序序列位置in开始找根结点在中序序列的位置
		//post是左子树的后序序列的第一个结点的位置
		//edge-in是左子树元素个数
		BT->rchild = pre_and_in_create(edge + 1, post + (edge - in), k - 1 - (edge - in));
		//edge+1是右子树中序序列的第一个结点的位置
		//post+(edge-in)是右子树后序序列的第一个结点的位置
		//右子树元素个数为总结点个数k,减去左子树结点个数,再减去根结点,即k-(edge-1)-1
		return BT;
	}
	else
		return NULL;

}

源代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
	char data;
	struct Node* lchild;
	struct Node* rchild;
}Node, * Root;
Node* queue[1000];
int rear = -1, front = -1;
void pre_order_create(Root* BT)
{  //ABD##EG###CF#H###
	*BT = (Root)malloc(sizeof(Node));
	char ch;
	scanf("%c", &ch);
	if (ch != '#')
	{
		(*BT)->data = ch;
		pre_order_create(&((*BT)->lchild));
		pre_order_create(&((*BT)->rchild));
	}
	else
	{
		*BT = NULL;
	}

}
void print_pre_order(Root BT)
{
	if (BT)
	{
		printf("%c", BT->data);
		print_pre_order(BT->lchild);
		print_pre_order(BT->rchild);
	}
}
void print_in_order(Root BT)
{
	if (BT)
	{
		print_in_order(BT->lchild);
		printf("%c", BT->data);
		print_in_order(BT->rchild);
	}
}
void print_post_order(Root BT)
{
	if (BT)
	{
		print_post_order(BT->lchild);
		print_post_order(BT->rchild);
		printf("%c", BT->data);
	}
}
void print_level_order(Root BT)
{
	Node* temp;
	if (BT)
	{
		queue[++rear] = BT;
		while (front != rear)
		{
			temp = queue[++front];
			printf("%c", temp->data);
			if (temp->lchild)				queue[++rear] = temp->lchild;
			if (temp->rchild)				queue[++rear] = temp->rchild;
		}
	}
}
Node* pre_and_in_create(char* in, char* post, int k)
{
	if (k > 0)
	{
		Node* BT = (Node*)malloc(sizeof(Node));
		char* edge = in;
		char* root_position = post + k - 1;
		BT->data = *root_position;
		while (*edge != *root_position)
		{
			edge++;
		}
		BT->lchild = pre_and_in_create(in, post, edge - in);
		BT->rchild = pre_and_in_create(edge + 1, post + (edge - in), k - 1 - (edge - in));
		return BT;
	}
	else
		return NULL;

}
Node* union_pre_and_in()
{
	Node* BT;
	char in[1000], post[1000];
	int k;
	printf("请输入结点个数:");
	scanf("%d", &k);
	printf("请输入中序序列:");
		scanf("%s", in);
	printf("请输入后序序列:");
		scanf("%s", post);
	BT = pre_and_in_create(in, post, k);
	return BT;
}
int main()
{
	Root BT;
	BT = union_pre_and_in();
	printf("前序遍历为:");
	print_pre_order(BT);
	printf("\n");
	printf("中序遍历为:");
	print_in_order(BT);
	printf("\n");
	printf("后序遍历为:");
	print_post_order(BT);
	printf("\n");
	printf("层次遍历为:");
	print_level_order(BT);
	printf("\n");
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称重复了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值