您的位置:首页 > 职场人生

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

2014-09-06 01:07 447 查看
/*
利用前序和中序,求后续遍历结果
输入:
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: