首页 > 学院 > 开发设计 > 正文

二叉排序树

2019-11-08 18:29:27
字体:
来源:转载
供稿:网友

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 Hint

Author

因为要判断是不是同一二叉排序树,所以就判断是否等于它本身。

#include<stdio.h>#include<stdlib.h>#include<string.h>struct node{ int data; struct node *l, *r;};struct node *creat(struct node *root, char number)//建树{ if(root == NULL) { root = (struct node *) malloc(sizeof(struct node)); root -> data = number; root -> l = NULL; root -> r = NULL; } else { if(root -> data > number) root -> l = creat(root -> l, number); else root -> r = creat(root -> r, number); } return root;};int x = 0;void judge(struct node *root1, struct node *root2){ if(root1 == NULL || root2 == NULL) { return; } if(root1 && root2) { if(root1 -> data != root2 -> data) return; else { x++; judge(root1 -> l, root2 -> l); judge(root1 -> r, root2 -> r); } }}int main(){ int n, len, i, j; char a[22], b[22]; while(scanf("%d", &n) != EOF) { if(n == 0) break; struct node *root1 = NULL;//划重点 scanf("%s", a); len = strlen(a); for(i = 0; i < len; i++) root1 = creat(root1, a[i]); for(i = 0; i < n; i++) { x = 0;//划重点 struct node *root2 = NULL;//划重点 scanf("%s", b); for(j = 0; j < len; j++) { root2 = creat(root2, b[j]); } judge(root1, root2); if(x == len) printf("YES/n"); else printf("NO/n"); } } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表