其他分享
首页 > 其他分享> > 由前序和中序重建二叉树,并用后序验证

由前序和中序重建二叉树,并用后序验证

作者:互联网

重建二叉树

由前序和中序重建二叉树,并用后序验证。

代码

具体解释见代码注释(个人感觉已经足够详细了)

#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include<stdio.h>
#include <string.h>

#define  N  100//最大节点数

typedef struct BiTNode//typedef等于为结构重命名
{
	char data;
	struct BiTNode* lchild, * rchild;
} BiTNode, * BITree;

//后序遍历  
void lastOrder(BiTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	lastOrder(root->lchild);
	lastOrder(root->rchild);
	printf("%c ", root->data);
}

BiTNode* createBiTree(char* pre, char* mid, int n)
{
	int i = 0;
	int n1 = 0, n2 = 0;
	int m1 = 0, m2 = 0;
	BiTNode* node = NULL;
	char lpre[N], rpre[N];
	char lmid[N], rmid[N];
	//空树
	if (n == 0)
	{
		return NULL;
	}

	node = (BiTNode*)malloc(sizeof(BiTNode));//指向内存大小
	if (node == NULL)
	{
		return NULL;
	}
	memset(node, 0, sizeof(BiTNode));//将node当前位置的后面与BiTNode相同规格的个字节赋0

	//先序序列的第一个元素必为根结点
	node->data = pre[0];
	//根据根结点将中序序列分为左子树和右子数
	for (i = 0; i < n; i++)
	{
		if ((i <= n1) && (mid[i] != pre[0]))//n1初始为0,随着判断累加,最后记录左边节点的总数
		{
			lmid[n1] = mid[i];//即lmid存中序中在此根节点左边的节点
			n1++;
		}
		else if (mid[i] != pre[0])//n2初始为0,随着判断累加,最后记录右边节点的总数
		{
			rmid[n2] = mid[i];//rmid存中序中在此根节点右边的节点
			n2++;
		}
	}
	//根据树的先序序列的长度等于中序序列的长度
	//且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
	//从i=1开始 因为先序遍历的第一个是根 
	for (i = 1; i < n; i++)
	{
		if (i < (n1 + 1))//n1代表了左子树的长度
		{
			lpre[m1] = pre[i];//左边的先序,而后在递归中使用
			m1++;
		}
		else
		{
			rpre[m2] = pre[i];//右边的先序
			m2++;
		}
	}
	//递归
	node->lchild = createBiTree(lpre, lmid, n1);
	node->rchild = createBiTree(rpre, rmid, n2);

	return node;
}

int main()
{
	char preNode[N];
	char midNode[N];
	int n = 0;
	char ch;
	BiTNode* root = NULL;

	printf("请输入先序序列\n");
	while ((ch = getchar()) && ch != '\n')
		preNode[n++] = ch;

	printf("请输入中序序列\n");

	n = 0;

	while ((ch = getchar()) && ch != '\n')
		midNode[n++] = ch;

	root = createBiTree(preNode, midNode, n);

	printf("\n");
	printf("用后序序列验证建的二叉树是否成功\n");
	lastOrder(root);

	system("pause");
	return 0;
}

标签:node,++,中序,BiTNode,char,二叉树,root,前序,先序
来源: https://blog.csdn.net/qq_50920794/article/details/110531870