二叉搜索(排序)树

本文介绍了一种算法,用于判断两个序列是否能够构成相同的二叉搜索树。通过层次遍历的方式将序列转换成二叉树结构,并比较两棵树是否完全相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉搜索树

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5130    Accepted Submission(s): 2295


Problem Description
判断两序列是否为同一二叉搜索树序列
 

Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
 

Output
如果序列相同则输出YES,否则输出NO
 

Sample Input
  
2 567432 543267 576342 0
 

Sample Output
  
YES NO
 

Source
 

Recommend
notonlysuccess   |   We have carefully selected several similar problems for you:   3787  3790  3789  3788  1710 


代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[1000];
int t1[1000],t2[1000];

void Insert(char w,int *t)
{
    int pos=1;
    int c=w-'0';
    while(t[pos]!=-1)
    {
        if(t[pos]<c)    //存入右孩子
            pos=2*pos+1;
        else
            pos=2*pos;  //存入左孩子
    }
    t[pos]=c;
}

void build(char *str,int *t){   //树层次存入数组中
    t[1]=str[0]-'0';
    for(int i=1;s[i];i++)
        Insert(s[i],t);
}

int main(){
    int n,i;
    while(scanf("%d",&n)!=EOF&&n)
    {
        memset(t1,-1,sizeof(t1));
        scanf("%s",s);
        build(s,t1);	//原有序列
        while(n--)	
        {
            int flag=1;
            memset(t2,-1,sizeof(t2));
            scanf("%s",s);
            build(s,t2);	//输入序列
            for(i=0;i<100;i++){
                if(t1[i]!=t2[i])
                    break;
            }
            if(i==100)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}


1.对于二叉排序,下面的说法( )是正确的。 A.二叉排序是动态表,查找不成功时入新结点时,会引起的重新分裂和组合 B.对二叉排序进行层序遍历可得到有序序列 C.用逐点入法构造二叉排序时,若先后入的关键字有序,二叉排序的深度最大 D.在二叉排序中进行查找,关键字的比较次数不超过结点数的1/2 2.在有n个结点且为完全二叉的二叉排序中查找一个键值,其平均比较次数的数量级为( )。 A.O(n) B.O(log2n) C.O(n*log2n) D.O(n2) 3.静态查找与动态查找的根本区别在于( )。 A. 它们的逻辑结构不一样 B. 施加在其上的操作不同 C. 所包含的数据元素类型不一样 D. 存储实现不一样 4.已知一个有序表为{12,18,24,35,47,50,62,83,90,115,134},当折半查找值为90的元素时,经过( )次比较后查找成功。 A.2 B.3 C.4 D.5 5.已知数据序列为(34,76,45,18,26,54,92,65),按照依次入结点的方法生成一棵二叉排序,则该的深度为( )。 A. 4 B. 5 C. 6 D. 7 6.设散列表表长m=14,散列函数H(k)=k mod 11 。表中已有15,38,61,84四个元素,如果用线性探测法处理冲突,则元素49的存储地址是( )。 A. 8 B. 3 C. 5 D. 9 7. 平衡二叉的查找效率呈( )数量级。 A. 常数阶 B. 线性阶 C. 对数阶 D. 平方阶 8. 设输入序列为{20,11,12,…},构造一棵平衡二叉,当入值为12的结点时发生了不平衡,则应该进行的平衡旋转是( )。 A. LL B. LR C. RL D. RR 二、填空题(每空3分,共24分)。 1.在有序表A[1..18]中,采用二分查找算法查找元素值等于A[7]的元素,所比较过的元素的下标依次为 。 2.利用逐点入法建立序列(61,75,44,99,77,30,36,45)对应的二叉排序以后,查找元素36要进行 次元素间的比较,查找序列为 。 3. 用顺序查找法在长度为n的线性表中进行查找,在等概率情况下,查找成功的平均比较次数是 。 4. 二分查找算法描述如下: intSearch_Bin(SST ST, KT key) { low=1 ; high=ST. length; while(low<=high) { mid=(low+high)/2; if(key==ST.elem[mid].key) return mid; else if(key<ST.elem[mid].key) ; else ; } return 0; } 5.链式二叉的定义如下: typedef struct Btn{ TElemType data; ; }BTN ,*BT; 6.在有n个叶子结点的哈夫曼中,总结点数是 。 三、综合题(共52分)。 1. (共12分)假定关键字输入序列为19,21,47,32,8,23,41,45,40,画出建立二叉平衡的过程。 2. (共15分)有关键字{13,28,3115,49,36,22,50,35,18,48,20},Hash 函数为H=key mod 13,冲突解决策略为链地址法,请构造Hash表(12分),并计算平均查找长度(3分)。 ASL= 3. (共10分)设关键字码序列{20,35,40,15,30,25},给出平衡二叉的构造过程。 4. (共15分)设哈希表长为m=13,散列函数为H(k)=k mod 11,关键字序列为5,7,16,12,11,21,31,5117,81;试求:散列后的表中关键字分布(假定解决冲突的方法为线性探测再散列法);求平均查找长度ASL;计算该表的装填因子。 (1)按要求求哈希表(10分): 0 1 2 3 4 5 6 7 8 9 10 11 12 (2)计算ASL(3分): ASL= (3)计算装填因子(2分):装填因子=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值