剑指Offer:面试题6 重建二叉树

来源:互联网 发布:米6相机清除数据 编辑:程序博客网 时间:2024/06/10 02:09
/*利用前序和中序,求后续遍历结果输入:FDXEAG(前序)XDE F AG(中序):例如找到F=3(i),则前序的左子树遍历范围是:s1+1到s1+3(i),右子树遍历范围是:s1+3(i)+1到e1输出:XEDGAF(后序)*/#include <stdio.h>#include <string.h>const int MAXSIZE = 100000;typedef struct Node{char _iVal;struct Node* _leftNode;struct Node* _rightNode;}Node;Node nodeArr[MAXSIZE];int _iIndex;//用于创建节点时计数Node* createNode(){++_iIndex;nodeArr[_iIndex]._leftNode = nodeArr[_iIndex]._rightNode = NULL;return &nodeArr[_iIndex];}Node* rebuildTree(char* sFront,char* sMid,int s1,int e1,int s2,int e2)//且注意,这里的e1是实际数组的长度-1(即抠除了结尾符){Node* root = createNode();root->_iVal = sFront[s1];//寻找根节点在中序中的位置int iRootIndex;for(int i = s2 ; i <= e2; i++){if(sMid[i] == root->_iVal){iRootIndex = i;break;}}//对左子树进行判空if(iRootIndex != s2)//说明左子树没有空{root->_leftNode = rebuildTree(sFront,sMid,s1+1,s1 + iRootIndex - s2,s2,iRootIndex -1);//对根节点的左孩子进行赋值}if(iRootIndex != e2)//右子树不空{root->_rightNode = rebuildTree(sFront,sMid,s1 + iRootIndex - s2 + 1,e1,iRootIndex + 1,e2);}return root;}void backOrder(Node* root)//注意这里采用递归{if(root->_leftNode){//root = root->_leftNode;//是递归不是赋值backOrder(root->_leftNode);}if(root->_rightNode){//root = root->_rightNode;backOrder(root->_rightNode);}printf("%c",root->_iVal);}void process(){char strFront[MAXSIZE];char strMid[MAXSIZE];while(EOF != scanf("%s %s",strFront,strMid)){_iIndex = -1;Node* root = rebuildTree(strFront,strMid,0,strlen(strFront)-1,0,strlen(strMid)-1);backOrder(root);printf("\n");}}int main(int argc,char* argv[]){process();getchar();return 0;}


 

0 0
原创粉丝点击