1つの数列が二叉木の後順に遍歴した結果かどうかを判断する
例えば配列a[]={5,7,6,9,11,10,8}
二査探索ツリーの後順遍歴であるか否かを判断するには,そのシーケンスを探索二叉木に還元するだけでよいが,二叉木の還元過程
1.ルートノードを特定します.もちろん、後続であるため、ルートノードは配列の末尾要素にあります.
2.2本の木の範囲と順番に挿入する方向を確定する
この問題で8がルートノードである6と10はルートノードに最も近い要素であり,すなわち挿入方向は6と10から順次前進し,6から5の位置はカットオフ,10から9の位置はカットオフである.
二査探索ツリーの後順遍歴であるか否かを判断するには,そのシーケンスを探索二叉木に還元するだけでよいが,二叉木の還元過程
1.ルートノードを特定します.もちろん、後続であるため、ルートノードは配列の末尾要素にあります.
2.2本の木の範囲と順番に挿入する方向を確定する
この問題で8がルートノードである6と10はルートノードに最も近い要素であり,すなわち挿入方向は6と10から順次前進し,6から5の位置はカットオフ,10から9の位置はカットオフである.
int a[]={5,7,6,9,11,10,8};
//
struct Node{
int val;
Node* left;
Node* right;
Node():val(0),left(NULL),right(NULL)
{}
};
int* FindSplit(int* const a,int length,int value)
{
if(NULL==a)
return NULL;
// a value
int key=value;
for(int i=0;i=value)
{
return &a[i];
}
}
return NULL;
}
void InsertNode(Node* root,int value)
{
if(NULL==root)
{
root=new Node();
root->val=value;
return;
}
Node* cur=root;
while(NULL!=cur)
{
if(cur->val>value)
{
//
if(NULL==cur->left)
{
cur->left=new Node();
cur->left->val=value;
break;
}
else
{
cur=cur->left;
}
}
else
{
//
if(NULL==cur->right)
{
cur->right=new Node();
cur->right->val=value;
break;
}
else
{
cur=cur->right;
}
}
}
}
void ReverTraversal(Node* root,vector &mm)
{
if(NULL==root)
{
return ;
}
ReverTraversal(root->left,mm);
ReverTraversal(root->right,mm);
mm.push_back(root->val);
}
int main()
{
int* begin=NULL,*end=NULL,* mid=NULL;
begin=a;
end=begin+(sizeof(a)/sizeof(int)-1);
mid=FindSplit(a,sizeof(a)/sizeof(int),*end);
Node* root=new Node();
root->val=*end;
int nCount=0;
int* prev=mid-1,*reser=(end-1);
for(;prev!=begin&&reser!=mid;)
{
if(nCount&0x1)
{
InsertNode(root,*prev);
prev--;
nCount++;
}
else
{
InsertNode(root,*reser);
reser--;
nCount++;
}
}
while(prev!=begin)
{
InsertNode(root,*prev);
prev--;
}
while(reser!=mid)
{
InsertNode(root,*reser);
reser--;
}
InsertNode(root,*begin);
InsertNode(root,*mid);
//
vectorhe;
ReverTraversal(root,he);
if(he.size()==sizeof(a)/sizeof(int))
{
bool mark=false;
for(nCount=0;nCount!=he.size();nCount++)
{
if(he[nCount]!=a[nCount])
{
cout<