問題解決のアイデア:
図1に示すように、入力データ側縁バイナリ検索ツリー、アレイに入力されるデータを構成
図2に示すように、先行予約先に、結果は、配列ツリーに格納されます。
図3に示すように、それは、ツリーアレイと均一なアレイか否かを判断します
1)一貫した出力YES、出力バイナリツリーを横断した後、
2)矛盾し、配列に格納されたプレスバイナリ画像注文トラバーサル、木、アレイ及びコンパレータツリーアレイは同じです
バイナリツリーを横断、出力画像に応じた一貫した出力YES、
それ以外の場合は、出力NO。
する#include <stdio.hに> する#include <malloc.hを> の#define最大100 のtypedef 構造体TNODE { int型データ、 ストラクト TNODE * 左; ストラクト TNODE * 右を。 } * BiTree。 BiTree BuildTree(BiTree T、int型X){//建立二叉搜索树 場合(!{T) T =(BiTree)はmalloc(はsizeof (BiTree))。 T - >データ= X。 T - >左= T->右= NULL; } 他{ 場合(X <T->データ) T - >左= BuildTree(T-> 左、X)。 他の T - >右= BuildTree(T-> 右、X); } 戻りTを。 } int型のツリー[最大]。 int型 K1 = 0 ; ボイドPreOrderTraverse(BiTree T){//前序遍历 場合(T){ // のprintf( "%dの"、T->データ)。 ツリー[K1 ++] = T-> データ; PreOrderTraverse(T - > 左)。 PreOrderTraverse(T - > 右)。 } } int型 K2 = 0 。 空隙MirrorPreOrder(BiTree T){//镜像前序遍历 場合(T){ // のprintf( "%dの"、T->データ)。 ツリー[K2 ++] = T-> データ; MirrorPreOrder(T - > 右)。 MirrorPreOrder(T - > 左)。 } } int型フラグ= 0 。 ボイド後順(BiTree T){//后序遍历 場合(T){ 後順(T - > 左)。 後順(T - > 右)。 もし(フラグ) のprintf(" " )。 他のフラグ= 1; printf(" %d個"、T-> データ)。 } } int型のタグ= 0 。 空MirrorPostOrder(BiTree T){//镜像后序遍历 場合(T){ MirrorPostOrder(T - > 右)。 MirrorPostOrder(T - > 左)。 場合(タグ) のprintf(" " ); 他のタグ= 1 ; printf(" %d個"、T-> データ)。 } } int型 IsSame(INTA []、INTツリー[]、INT N-){//が同じ順序の先行順走査で入力データか否かを判断 INT I; のため(私は= 0を I <N-; I ++ ){ IF!(A [I] = ツリー[I])を 返す 0 ; } リターン 1。; } int型のmain(){ int型I、X、N-; scanfの(" %のD "、およびN-); INT A [N-]; BiTree T = NULL; のための(I = 0、I <N - 、I ++ ){ scanfの("%のD "および[I]); T = BuildTree(T、[I]); } PreOrderTraverse(T); 場合(IsSame(木、N)){ のprintf(" YES \ n " ); 後順(T); } 他{ MirrorPreOrder(T); 場合(IsSame(木、N)){ のprintf(" YES \ n " ); MirrorPostOrder(T); } 他 のprintf(" NO " ); } 戻り 0 ; }