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

/*
利用前序和中序,求后续遍历结果
输入:
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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值