7-28 搜索树判断 (25 分) 对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式: 输入的第一行包含一个正整数$N$(≤1000),第二行包含$N$个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式: 输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES
,否侧输出NO
。如果判断结果是YES
,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
输出样例1:
输入样例2:
输出样例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TNode *tree ;struct TNode { int data; tree lchild; tree rchild; }; int flag = 0 ; int flag1 ; int flag2 ; void Print ( tree t) ;tree Find ( int pre[],int len) ;tree FindMirror ( int pre[],int len) ;int main () { int len; int pre[1005 ]; int i; tree t,tm; scanf ("%d" ,&len); for ( i=0 ; i<len; i++) { scanf ("%d" ,&pre[i]); } t = Find( pre,len); tm = FindMirror( pre,len ); if ( t && !flag1) { printf ("YES\n" ); Print( t ); printf ("\n" ); } else if ( tm && !flag2) { printf ("YES\n" ); Print( tm ); printf ("\n" ); } else printf ("NO\n" ); return 0 ; } tree Find ( int pre[],int len) { int i,j; if ( !len ) return NULL ; tree temp = (tree) malloc ( sizeof ( struct TNode)); temp->data = *pre; for ( i=1 ; i<len; i++) { if ( pre[i] >= temp->data) break ; } for ( j=i; j<len; j++) { if ( pre[j] < temp->data) { flag1 = 1 ; return NULL ; } } temp->lchild = Find( pre+1 , i-1 ); temp->rchild = Find( pre+i, len-i); return temp; } tree FindMirror ( int pre[],int len) { int i,j; if ( !len ) return NULL ; tree temp = (tree) malloc ( sizeof ( struct TNode)); temp->data = *pre; for ( i=1 ; i<len; i++) { if ( pre[i] < temp->data) break ; } for ( j=i; j<len; j++) { if ( pre[j] >= temp->data) { flag2 = 1 ; return NULL ; } } temp->lchild = FindMirror( pre+1 , i-1 ); temp->rchild = FindMirror( pre+i, len-i); return temp; } void Print ( tree t) { if ( t ) { Print(t->lchild); Print(t->rchild); if ( !flag ) flag = 1 ; else printf (" " ); printf ("%d" ,t->data); } }