国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

二叉排序樹

2019-11-08 18:40:16
字體:
來源:轉載
供稿:網友

二叉排序樹 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic PRoblem Description

二叉排序樹的定義是:或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉排序樹。 今天我們要判斷兩序列是否為同一二叉排序樹 Input

開始一個數n,(1<=n<=20) 表示有n個需要判斷,n= 0 的時候輸入結束。 接下去一行是一個序列,序列長度小于10,包含(0~9)的數字,沒有重復數字,根據這個序列可以構造出一顆二叉排序樹。 接下去的n行有n個序列,每個序列格式跟第一個序列一樣,請判斷這兩個序列是否能組成同一顆二叉排序樹。(數據保證不會有空樹) Output

Example Input

2 123456789 987654321 432156789 0 Example Output

NO NO

#include <stdio.h>#include <string.h>char s[100],s1[100];int k,j;typedef struct node{ char data; struct node *l,*r;}node;node *creat_BST(node *root,char key)//建立二叉排序樹{ if(root){ if(root->data > key) root->l = creat_BST(root->l,key); else root->r = creat_BST(root->r,key); } else{ root = (node *)malloc(sizeof(struct node)); root->l = NULL; root->r = NULL; root->data = key; } return root;}void preOrder(node *root)//通過兩個建立好的二叉排序樹的先序比較判斷兩棵樹是否相等{ if(root){ s[k++] = root->data; preOrder(root->l); preOrder(root->r); }}void preOrder1(node *root){ if(root){ s1[j++] = root->data; preOrder1(root->l); preOrder1(root->r); }}int main(){ int n,i; char a[100],b[100]; while(~scanf("%d",&n)&&n){ node *root = NULL; scanf("%s",a); int len = strlen(a); for(i=0; i<len; i++) root = creat_BST(root,a[i]); k = 0; preOrder(root); s[k] = '/0'; while(n--){ node *root1 = NULL; scanf("%s",b); int len1 = strlen(b); for(i=0; i<len1; i++) root1 = creat_BST(root1,b[i]); j = 0; preOrder1(root1); s1[j] = '/0'; if(strcmp(s,s1)==0) printf("YES/n"); else printf("NO/n"); } } return 0;}

其實這題也不用這么麻煩,有一種聰明的方法去做 不過提交上去卻是WA,如果有高人知道這么修改的話,俺先在此謝過大俠

WA代碼

#include <stdio.h>#include <string.h>char str[100];int k;typedef struct node{ char data; struct node *l,*r;}node;node *create(node *root,char key){ if(root){ if(root->data>key) root->l = create(root->l,key); else root->r = create(root->r,key); } else{ root = (node *)malloc(sizeof(struct node)); root->l = NULL; root->r = NULL; root->data = key; } return root;}int tree_check(node *root,node *root1){ if(root->data==root1->data||root==NULL&&root1==NULL) return 1; else return 0; if(tree_check(root->l,root1->l)&&tree_check(root->r,root1->r)) return 1;}int main(){ int n,i,len; char a[100],b[100]; while(~scanf("%d",&n)&&n){ node *root = NULL; scanf("%s",a); len = strlen(a); for(i=0; i<len; i++) root = create(root,a[i]); while(n--){ node *root1 = NULL; scanf("%s",b); int len = strlen(b); for(i=0; i<len; i++) root1 = create(root1,b[i]); if(tree_check(root,root1)==1) printf("YES/n"); else printf("NO/n"); } } return 0;}

之前真是傻逼,居然else后還return 0,這樣整個函數都跳出了啊,根本不會再進行下去了。

喲吼,爽歪歪,終于搞出了另外一種方法了

void tree_check(node *root,node *root1)//搞個全局變量來判斷不就好了,不要糾結于整個函數的返回值,這樣很麻煩的{ if(root&&root1){//題目說不會有空樹 if(root->data==root1->data){//如果結點的數據相同那么就遞歸跑起來咯 k++;//這個k如果等于結點的個數的話,那么兩棵樹不就相同了嗎 tree_check(root->l,root1->l);//這里是比較兩棵樹的左子樹的 tree_check(root->r,root1->r);//這是右子樹 } }}
上一篇:分享一個鏈接

下一篇:dfs隨筆,迷宮

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 那曲县| 荣昌县| 永嘉县| 恩施市| 涿鹿县| 莎车县| 鱼台县| 洱源县| 康平县| 马关县| 纳雍县| 溆浦县| 始兴县| 休宁县| 沁源县| 深水埗区| 蓬莱市| 定襄县| 高陵县| 蓬安县| 鄂伦春自治旗| 峨山| 恭城| 诸城市| 平远县| 孙吴县| 德清县| 东莞市| 土默特左旗| 嘉禾县| 大姚县| 西昌市| 东阳市| 铜鼓县| 如东县| 张家口市| 安达市| 龙泉市| 社会| 闽侯县| 南康市|