BST 二叉搜尋樹 (動態建樹與靜態建樹)
阿新 • • 發佈:2019-01-09
//判斷兩棵樹是否是同一棵樹:先序遍歷和中序遍歷對應相同或者中序遍歷和後序遍歷對應相同 //程式碼思路:兩個陣列分別存放建好的樹的先序遍歷以及正序遍歷結果,然後對比是否相等 //題目意思 這題是 HDU 3791 題目描述: 判斷兩序列是否為同一二叉搜尋樹序列 輸入: 開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。 接下去一行是一個序列,序列長度小於10,包含(0~9)的數字,沒有重複數字,根據這個序列可以構造出一顆二叉搜尋樹。 接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜尋樹。 輸出: 如果序列相同則輸出YES,否則輸出NO 樣例輸入: 2 567432 543267 576342 0 樣例輸出: YES NO #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef struct TiNode { char data; struct TiNode *left,*right; }TiNode,*BiTree; char prearr[15],prearr2[15]; char midarr[15],midarr2[15]; void buildtree(BiTree &T,int x)//建樹 { if(T==NULL) { T=(BiTree)malloc(sizeof(BiTree)); T->data=x; T->left=NULL; T->right=NULL; } else if(x<T->data) { buildtree(T->left,x) ; } else if(x>T->data) { buildtree(T->right,x); } } void Presearch(BiTree T,int &index)//先序遍歷 { prearr[index++]=T->data; if(T->left!=NULL) Presearch(T->left,index); if(T->right!=NULL) Presearch(T->right,index); } void Midsearch(BiTree T, int &index)//中序遍歷 { if(T->left!=NULL) Midsearch(T->left,index); midarr[index++]=T->data; if(T->right!=NULL) Midsearch(T->right,index); } int main() { int N,index; char str[15],str2[15]; while(scanf("%d",&N)!=EOF&&N!=0) { BiTree T=NULL; scanf("%s",str); for(int k=0;k<strlen(str);k++) { buildtree(T,str[k]);//建樹 } index=0; Presearch(T,index) ; prearr[index]='\0'; strcpy(prearr2,prearr); index=0; Midsearch(T,index); midarr[index]='\0'; strcpy(midarr2,midarr); for(int i=0;i<N;i++) { T=NULL; scanf("%s",str2); for(int g=0;g<strlen(str2);g++) { buildtree(T,str2[g]); } index=0; Presearch(T,index); prearr[index]='\0'; if(strcmp(prearr,prearr2)!=0) { printf("NO\n"); continue; } index=0; Midsearch(T,index); midarr[index]='\0'; if(strcmp(midarr,midarr2)!=0) { printf("NO\n"); continue; } printf("YES\n"); free(T); } } return 0; } //還是這個題意,我們換一種建樹方法,這次採用靜態建樹的方法 #include <iostream> using namespace std; #include <cstring> #define MAX 666 int node[MAX]; int node2[MAX]; void makeTree(char *str,int *node) { for(int i=0;str[i]!='\0';i++) { int j=0; int t=str[i]-'0'; while(node[j]!=-1) { if(t>node[j]) j=(j+1)*2; if(t<node[j]) j=(j+1)*2-1; } node[j]=t; } } void compare() { for(int i=0;i<MAX;i++) if(node[i]!=node2[i]) { cout<<"NO"<<endl; return; } cout<<"YES"<<endl; } int main() { int n; char str[12],str2[12]; cin>>n; if(!n) return 0; memset(node,-1,sizeof(node)); cin>>str; makeTree(str,node); int len=strlen(str); while(n--) { memset(node2,-1,sizeof(node2)); cin>>str2; int len2=strlen(str2); if(len!=len2) { cout<<"NO"<<endl; continue; } makeTree(str2,node2); compare(); } main(); return 0; }