题目
description:
已知一棵二叉树的前序序列和中序序列分别存于两个一维数组中,试编写算法建立该二叉树的二叉链表。
input:
分两行分别输入一棵二叉树的前序序列和中序序列。
output:
输出该二叉树的后序序列。
sample_input:
ABDFGCEH
BFDGACEH
sample_output:
FGDBHECA
思路
- 主要递归函数*createBTNode()*采用先序建立二叉树
- 从0开始遍历数组str1[],每次在数组str2[]中找到与数组str1[]当前结点相等的结点,并以该节点为父节点,计算其左右子树节点的个数,如下图所示,第一列为数组str1[],第二列为数组str2[]:
代码如下:
BTNode *B = (BTNode *)malloc(sizeof(BTNode));
B->data = str1[prestart];
B->lchild = NULL;
B->rchild = NULL;
for (i = midstart; str2[i] != B->data; i++); //在中序遍历中找根节点
llen = i - midstart; //左子树长度
rlen = midend - i; //右子树长度
- 只要左右子树的长度不为0,则继续递归建立结点
- 按照数组str1[]存储的数据,先序地建立
左子树
- 在先序遍历得到的数组中str1[],头结点的下一个结点是其左结点,故prestart + 1
- midstart是数组str2[]遍历的起点,由于是左子树,故每次从头开始即可
- midend用来计算当前结点右子树结点的个数(midend - i),等于上一轮的midend去掉右子树结点个数,即i - 1