- 前序:根 左子树 右子树
- 中序:左子树 根 右子树
- 过程分析,E是根,初始长度11,创建根节点,E在中序遍历索引为4,说明左子树有4个元素,Rebuild左子树,preStart+1,此时到了pre[preStart]已经成了B,B在中序位置为1,B的左子树有一个元素,RebuildB的左子树,preStart继续递增,此时pre[Start]为A,A在中序遍历中索引为0,左子树为空,RebuildA的左子树时length=0,A->LChild=NULL。返回RebuildA的右子树,preStart这时加i+1时为了跳过A左子树已经建立的那些元素,A右子树元素起始位置inStart=A的位置+1=inStart+i+1,在中序遍历中A的右子树元素个数length(A右子树元素个数)=length(以A为根的子树所有元素个数,即B的左子树的length)-i(A的左子树元素个数)-1(A这个结点本身)。
- 总结:rebuild的过程就是先建立根节点,找到左子树元素个数,rebuild左子树,找到右子树元素个数,rebuild右子树
#include <stdlib.h>
#include <stdio.h>
typedef struct Node {
char data;
struct Node *LChild;
struct Node *RChild;
} BiTNode, *BiTree;
void Rebuild(BiTree *root,char *preOrder, char *inOrder, int preStart, int inStart, int length) {
if (length == 0) {(*root)=NULL;return;}
char h= preOrder[preStart];
(*root) = (BiTree)malloc(sizeof(BiTNode));
(*root)->data=preOrder[preStart];
int i;
for (i = length - 1; i >= 0; i--) {
if (h == inOrder[inStart + i]) {
Rebuild(&((*root)->LChild),preOrder, inOrder, preStart + 1, inStart, i);
Rebuild(&((*root)->RChild),preOrder, inOrder, preStart + 1 + i, inStart +i+ 1, length - i - 1);
}
}
}
void PrintTree(BiTree bt, int nLayer) {
int i;
if (bt == NULL) {
return;
}
PrintTree(bt->RChild, nLayer + 1);
for (i = 0; i < nLayer; i++)
printf(" ");
printf("%c\n", bt->data);
PrintTree(bt->LChild, nLayer + 1);
};
int main() {
char pre[] = {'E', 'B', 'A', 'D', 'C', 'F', 'H', 'G', 'I', 'K', 'J'}, in[] = {'A', 'B', 'C', 'D', 'E','F', 'G', 'H', 'I', 'J', 'K'};
BiTree bt;
Rebuild(&bt,pre,in,0,0,11);
PrintTree(bt, 1);
return 0;
}