剑指offer面试题06

题目:

输入某二叉树的前序遍历和中序遍历的结果,构建该二叉树。



代码如下:


//用于学习用途

//主要算法归剑指offer原作者所有


#include <iostream>
using namespace std;



//const int MaxSize=100;

//没用到


struct BinaryTreeNode{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
} ;
BinaryTreeNode * ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder);
BinaryTreeNode * Construct(int *preorder,int *inorder,int length)
{
if(preorder==NULL||inorder==NULL||length<=0)
return NULL;
return ConstructCore(preorder,preorder+length-1,inorder,inorder+length-1);
}


BinaryTreeNode * ConstructCore(int *startPreorder,int *endPreorder,int *startInorder,int *endInorder)
{
int rootValue=startPreorder[0];
BinaryTreeNode *root=new BinaryTreeNode();
root->m_nValue=rootValue;
root->m_pLeft=root->m_pRight=NULL;
if(startPreorder==endPreorder)
{
if(startInorder==endInorder&&*startPreorder==*startInorder)
return root;
else
throw std::exception("Invalid input.");
}


int *rootInorder=startInorder;
while(rootInorder<=endInorder&&*rootInorder!=rootValue)
++rootInorder;
if(rootInorder==endInorder&&*rootInorder!=rootValue)
throw std::exception("Invalid input.");


int leftLength=rootInorder-startInorder;
int *leftPreorderEnd=startPreorder+leftLength;


if(leftLength>0)//构建左子树
{
root->m_pLeft=ConstructCore(startPreorder+1,leftPreorderEnd,startInorder,rootInorder-1);
}
if(leftLength<endPreorder-startPreorder)//构建右子树
{
root->m_pRight=ConstructCore(leftPreorderEnd+1,endPreorder,rootInorder+1,endInorder);
}
return root;
}
void print(BinaryTreeNode *root)//输出树的前序遍历结果
{
if(root==NULL)
return ;
else
cout<<root->m_nValue<<"\t";
print(root->m_pLeft);
print(root->m_pRight);
}


void main(){
int preorder[]={1,2,4,7,3,5,6,8};//前序
int inorder[]={4,7,2,1,5,3,8,6};//中序

BinaryTreeNode * root=Construct(preorder,inorder,8);
print(root);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值