Microsoft | Coding
from CareerCup by sarthak
Given a preorder and inorder traversal of a binary tree, can you reproduce the tree? if yes, then write a function using C/C++ that builds the tree and returns the root node of the tree.
#include < stdio.h>
#include <iostream>
#include <stack>
#include <Windows.h>
#include <string>
![](/Images/OutliningIndicators/None.gif)
using namespace std;
#define CHECK(x) {if(!(x)){printf("Fatal error: " #x);exit(0);}}
void Trace(char* szFormat,
)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
va_list l;
char s[500];
![](/Images/OutliningIndicators/InBlock.gif)
va_start(l,szFormat);
vsprintf(s,szFormat,l);
OutputDebugStringA(s);
}
![](/Images/OutliningIndicators/None.gif)
typedef class BiTNode
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
char data;
BiTNode *lc,*rc;
}*BiTree;
![](/Images/OutliningIndicators/None.gif)
//根据先序和中序创建二叉树
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//************************************************************************/
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//* Microsoft | Coding
from CareerCup by sarthak
Given a preorder and inorder traversal of a binary tree, can you reproduce the tree?
if yes, then write a function using C/C++ that builds the tree and returns the root node of the tree. */
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//************************************************************************/
BiTree BiTreeCreate(string preStr,string inStr)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
CHECK(preStr.size() ==inStr.size() && inStr.size()>0);
char c=preStr[0];
int pos=inStr.find_first_of(c);
CHECK(pos!=-1);
BiTree p=new BiTNode;
p->data=c;
if(pos==0)
p->lc=0;
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string ins1=inStr.substr(0,pos);
string pres1=preStr.substr(1,pos);
Trace("ins1:%s ,pres1:%s",ins1.c_str(),pres1.c_str());
p->lc=BiTreeCreate(pres1,ins1);
}
if(pos==preStr.size()-1)
p->rc=0;
else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string ins2=inStr.substr(pos+1);
string pres2=preStr.substr(1+pos);
Trace("ins2:%s ,pres2:%s",ins2.c_str(),pres2.c_str());
p->rc=BiTreeCreate(pres2,ins2);
}
return p;
}
![](/Images/OutliningIndicators/None.gif)
void TraverseInOrder2(BiTree T)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(T)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
TraverseInOrder2(T->lc);
cout<<T->data;
TraverseInOrder2(T->rc);
}
}
![](/Images/OutliningIndicators/None.gif)
//先序遍历
void Traverse1Order(BiTree T)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
if(T)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
cout<<T->data;
Traverse1Order(T->lc);
Traverse1Order(T->rc);
}
}
![](/Images/OutliningIndicators/None.gif)
void Test()
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
BiTree tree=BiTreeCreate("ABDECFG","DBEAFCG");
cout<<"preOrder:"<<endl;
Traverse1Order(tree);
cout<<endl<<"inOrder:"<<endl;
TraverseInOrder2(tree);
cout<<endl;
}
![](/Images/OutliningIndicators/None.gif)