二叉搜索树(模板)
題意:先給一組數(shù)據(jù)構(gòu)建一顆二叉搜索樹作為標準樹。緊跟著n組數(shù)據(jù)中,判斷每組 數(shù)據(jù)構(gòu)成的二叉搜索樹是否和標準樹yi一樣。 思路:兩棵樹如果一樣的話,就是擁有一樣的節(jié)點,在每個節(jié)點上具有相同的值,且 在相同遍歷條件下,遍歷的順序是一樣的。因此我們可以在遍歷二叉樹的時候,每向 下移動一個節(jié)點時,判斷是否與此時的標準樹一致。
判斷兩序列是否為同一二叉搜索樹序列
Input
開始一個數(shù)n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結(jié)束。?
接下去一行是一個序列,序列長度小于10,包含(0~9)的數(shù)字,沒有重復(fù)數(shù)字,根據(jù)這個序列可以構(gòu)造出一顆二叉搜索樹。?
接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉搜索樹。
Output
如果序列相同則輸出YES,否則輸出NO?
Sample Input
2 567432 543267 576342 0Sample Output
YES NO #include<stdio.h> #include<string.h> struct node {int val;node *law,*raw; }; bool flag; node *insert(node *p,int x) //依次插入每個值 {if(p==NULL) //節(jié)點為空時,插入此節(jié)點{node *q = new node; //申請一個動態(tài)空間q->val=x; //賦值q->law = q->raw =NULL; //左右兒子為空return q; //返回此節(jié)點的地址}else //不為空,代表此節(jié)點有值{if(p->val>x) //如果這個值小于左兒子p->law = insert(p->law,x); //遞歸向下尋找相應(yīng)的位置,回溯賦值,構(gòu)建鏈表else //同理p->raw = insert(p->raw,x);return p;} } void check(node *root,node *rom) //傳入標準樹和判斷樹的地址 {if(root!=NULL&&rom!=NULL) //如果兩個地址都不為空,即此節(jié)點兩棵樹都有值,只需判斷值是否相同{check(root->law,rom->law);//中序遍歷if(root->val!=rom->val) //判斷此節(jié)點的值是否和標準樹一致flag=false;check(root->raw,rom->raw);}else if(root!=NULL||rom!=NULL) //如果兩顆樹中,只有一棵樹在這個節(jié)點有值,那么這兩棵樹肯定不一致flag=false; } int main() {int n;while(~scanf("%d",&n)&&n){node *root=NULL;//標準樹地址為空char str[20];scanf("%s",str);for(int i=0; i<strlen(str); i++) //構(gòu)建一顆標準樹root = insert(root,str[i]-'0');for(int i=0; i<n; i++) //n組數(shù)據(jù){flag=true; //標記node *rom=NULL; //判斷樹地址為空scanf("%s",str);for(int i=0; i<strlen(str); i++) //構(gòu)建判斷樹rom = insert(rom,str[i]-'0');check(root,rom); //中序遍歷,檢查兩棵樹是否一致if(flag)printf("YES\n");elseprintf("NO\n");}}return 0; }?
總結(jié)
- 上一篇: Largest Rectangle in
- 下一篇: Not so Mobile(二叉树递归输