重建二叉树
来源:互联网 发布:黑马程序员有用吗 编辑:程序博客网 时间:2024/04/28 20:07
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct Node{ char chValue; struct Node *lChild; struct Node *rChild;}Node;//重建二叉树void Rebuild(char *pPreOrder , char *pInOrder , Node **pRoot , int nTreeLen){ int nLeftLen , nRightLen; char *pLeftEnd; Node *p; //边界条件检查 if(!pPreOrder || !pInOrder || !pRoot) return; if(!(p = (Node *)malloc(sizeof(Node)))) return; p->chValue = *pPreOrder; p->lChild = p->rChild = NULL; *pRoot = p; if(nTreeLen == 1) return; //划分左右子数 pLeftEnd = pInOrder; while(*pLeftEnd != *pPreOrder) pLeftEnd++; nLeftLen = (int)(pLeftEnd - pInOrder); nRightLen = nTreeLen - nLeftLen - 1; if(nLeftLen) Rebuild(pPreOrder + 1 , pInOrder , &(p->lChild) , nLeftLen); if(nRightLen) Rebuild(pPreOrder + nLeftLen + 1, pInOrder + nLeftLen + 1 , &(p->rChild) , nRightLen);}//后序遍历void PostOrder(Node *p){ if(p) { PostOrder(p->lChild); PostOrder(p->rChild); printf("%c",p->chValue); }}int main(void){ char PreOrder[32] , InOrder[32]; Node *pTree; //输入先序和中序序列 while(scanf("%s%s", PreOrder , InOrder) != EOF) { Rebuild(PreOrder , InOrder , &pTree , strlen(PreOrder)); PostOrder(pTree); printf("\n"); } return 0;}