版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xjm850552586/article/details/71274393
用上图二叉树作为一个例子
中序遍历:8 4 9 2 10 5 1 6 3 7
后序遍历:8 9 4 10 5 2 6 7 3 1
1.首先我们通过后序遍历寻找整颗二叉树的根结点,由于后序遍历的特点为 “左右根 ”,所以后边遍历的最后一个值便是根节点的值,根节点值为1
2.由于中序遍历的特点为“左根右”,我们知道了根节点后,便可以推出根节点的左子树与右子树
3.在左子树中递归刚才的过程
4.在右子树中递归刚才的过程
所以在上图树中,我们先找到了根节点为1,然后左子树中序遍历为8 4 9 2 10 5 ,左子树后序遍历为 8 9 4 10 5 2,我们又找到了左子树的根节点为2,然后左子树的左子树中序遍历便为8 4 9……(以此类推,递归算法)
通过中序遍历、后序遍历 输出先序遍历,下面的代码在解决过程中未建立二叉树。
#include<stdio.h>
#include<stdlib.h>
void fun(char*inorder, char*postorder, int length)
{
if (length == 0)
return;
int rootindex = 0;
for (; rootindex < length; rootindex++)
if (inorder[rootindex] == postorder[length - 1])
break;
printf("%c", inorder[rootindex]);
fun(inorder, postorder, rootindex);
fun(inorder + rootindex+1, postorder+rootindex, length - rootindex-1);
}
int main()
{
int length;
printf("请输入二叉树的结点数:");
scanf("%d",&length);
getchar();
char*Inordertree;//中序
char *Postordertree;//后序
Inordertree = (char*)malloc(length*sizeof(char));
Postordertree = (char*)malloc(length*sizeof(char));
int i;
printf("请输入二叉树的中序遍历(回车结束)");
for (i = 0; i < length; i++)
scanf("%c",&Inordertree[i]);
getchar();
printf("请输入二叉树的后序遍历(回车结束)");
for (i = 0; i < length; i++)
scanf("%c",&Postordertree[i]);
getchar();
printf("二叉树的先序遍历为:");
fun(Inordertree, Postordertree, length);
printf("\n");
system("pause");
return 0;
}
效果展示(10用A代替)
通过先序遍历、中序遍历求后序遍历 方法与此类似。
如果希望建立二叉树,那么上述方法可以给你提供一点点小思路~