版权声明:本文为博主原创文章,欢迎交流学习,未经博主允许不得转载。 https://blog.csdn.net/qq_43749739/article/details/90003726
注:备战2020ing…暂时没时间注解啦,大家凑合先看下代码叭,肥宅对不住了。
#include <cstdio>
#include <cstdlib>
typedef struct BstNode
{
int data;
struct BstNode *lchild, *rchild;
}BstNode, *Bstree;
int data[1000], N;
void Insert( Bstree &T, int K )
{
if( !T )
{
T = (Bstree) malloc( sizeof( BstNode ) );
T->data = K;
T->lchild = T-> rchild = NULL;
}
else if( T->data > K )
Insert( T->lchild, K );
else Insert( T->rchild, K );
}
void Invert( Bstree &T )
{
if( T )
{
Invert( T->rchild );
Invert( T->lchild );
BstNode *t = T->rchild;
T->rchild = T->lchild;
T->lchild = t;
}
}
bool isBST( Bstree T, int &i )
{
if( !T )
return true;
if( T->data != data[i++] )
return false;
if( isBST( T->lchild, i ) )
return isBST( T->rchild, i );
return false;
}
bool PostOrder( Bstree T, int &cnt)
{
if(T)
{
PostOrder( T->lchild, cnt );
PostOrder( T->rchild, cnt );
printf("%s%d%s", !(cnt++) ? "YES\n":"", T->data, cnt == N - 1 ? "":" ");
}
}
int main()
{
Bstree T = NULL;
int k1 = 0, k2 = 0, cnt = 0;
scanf("%d", &N);
for( int i = 0; i < N; ++i )
{
scanf("%d", &data[i]);
Insert(T, data[i]);
}
if( isBST( T, k1 ) )
PostOrder( T, cnt );
else
{
Invert( T );
if( isBST( T, k2 ) )
PostOrder( T, cnt );
else
printf("NO");
}
}