由前序和中序重建二叉树,并用后序验证
作者:互联网
重建二叉树
由前序和中序重建二叉树,并用后序验证。
代码
具体解释见代码注释(个人感觉已经足够详细了)
#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