前序和中序遍历重构二叉树,C语言

  1. 前序:根 左子树 右子树
  2. 中序:左子树 根 右子树
  3. 过程分析,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这个结点本身)。
  4. 总结: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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值