二叉搜索树 二叉搜索树是二叉树的一种 它具有4条性质 1. 若左子树不为空,则其左子树上的结点的值全都小于其根节点 2. 若右子树不为空,则其右子树上的结点的值全都大于其根节点 3. 二叉搜索树的左右子树本身都是单独的一个完整的二叉搜索树 4. 数值最大的节点没有左孩子,数值最小的节点没有右儿子 (后文中,n是节点个数,h为高度) 例题:3507 题目描述 判断两序列是否为同一二叉搜索树序列 输入 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。 输出 如果序列相同则输出YES,否则输出NO 样例输入1 2
567432 A
543267 B
576342 C
0 样例输出1 YES
NO 提示/说明 每个序列长度不超过20 标签 普及+/提高 其他 二叉搜索树,BST 解题思路: 1. 假设输入的A串为中序遍历,构造出二叉搜索树,存储前序遍历,中序遍历,后序遍历,和层次遍历 2. 依次判断B,C串 3. 输出 4. 参考代码 - #include<bits/stdc++.h>
- using namespace std;
- struct BiNode
- {
- char data;
- BiNode *lchild;
- BiNode *rchild;
- };
- char a[20];
- int num;
- void create(BiNode *&root,char ch)
- {
- if(root==NULL)//为空直接插入
- {
- root=(BiNode*)malloc(sizeof(BiNode));
- root->data=ch;
- root->lchild=NULL;
- root->rchild=NULL;
- }
- else
- {
- if(ch < root->data)
- create(root->lchild,ch);
- else
- create(root->rchild,ch);
- }
- }
- void pre(BiNode *root)//前序遍历
- {
- if(root!=NULL)
- {
- a[num++]=root->data;
- pre(root->lchild);
- pre(root->rchild);
- }
- }
- int main()
- {
- char str1[20],str2[20];
- int n;
- while(~scanf("%d",&n))
- {
- num=0;
- char b[20],c[20];
- BiNode *root;
- root=NULL;
- scanf("%s",str1);
- for(int i=0; str1[i]; i++)
- create(root,str1[i]);
- pre(root);
- strcpy(b,a);///将第一棵树前序遍历序列保存在b中
- for(int i=0; i<n; i++)
- {
- num=0;
- int flag=0;
- BiNode *bt;
- bt=NULL;
- scanf("%s",str2);
- for(int i=0; str2[i]; i++)
- create(bt,str2[i]);
- pre(bt);
- strcpy(c,a);///将第二棵树前序遍历序列保存在c中
- if(strcmp(b,c)!=0)
- printf("NO\n");
- else
- printf("YES\n");
- }
- }
- return 0;
- }
复制代码
|