前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >二叉搜索树(BST)- HDU 3791

二叉搜索树(BST)- HDU 3791

作者头像
ACM算法日常
发布于 2018-08-07 10:45:31
发布于 2018-08-07 10:45:31
81500
代码可运行
举报
文章被收录于专栏:ACM算法日常ACM算法日常
运行总次数:0
代码可运行

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

  1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
  2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
  3. 任意节点的左、右子树也分别为二叉查找树;
  4. 没有键值相等的节点。

虽然二叉查找树的最坏效率是O(n),但它支持动态查询,且有很多改进版的二叉查找树可以使树高为O(log n),如SBT,AVL树,红黑树等。故不失为一种好的动态查找方法。

题目:

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

解题思路:

对于任意的一个输入序列S,第一个元素是根节点,每次将序列中的元素与第一个元素比较,小于的放在左边,大于的放在右边,对于每次分好的左孩子序列SL和右孩子序列SR,执行与S相同的操作。

性能关键点:采用数组的方式存储左右孩子,函数传递参数时不需要拷贝字符串操作,不涉及堆内存分配和销毁操作。

源代码:G++ 0ms

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<string.h>

//是否是同一棵binary search tree
int is_same_bst(char * bst, char * bst_cmp, int len) {
    //第一个表示根节点,根节点肯定相同
    if (bst[0] != bst_cmp[0])
        return 0;
    //长度为0或者为1或者为2的时候比较一下
    if (len <= 1 || (len == 2 && bst[1] == bst_cmp[1])) {
        return 1;
    }
    //分配左右孩子树的存储空间
    char bst_left[10] = "", bst_right[10] = "", 
        bst_cmp_left[10] = "", bst_cmp_right[10] = "";
    int bl = 0, br = 0, bcl = 0, bcr = 0;

    for (int i = 1; i < len; i++) {
        //依次放在左右孩子上
        bst[i] > bst[0] ? (bst_right[br++] = bst[i]) : (bst_left[bl++] = bst[i]);
        bst_cmp[i] > bst_cmp[0] ? (bst_cmp_right[bcr++] = 
            bst_cmp[i]) : (bst_cmp_left[bcl++] = bst_cmp[i]);
    }
    //递归判断子树是否是一样的
    return is_same_bst(bst_left, bst_cmp_left, bl) && 
        is_same_bst(bst_right, bst_cmp_right, br);
}

int main() {
    int cmp_count;
    char bst[30], bst_cmp[30];

    while (~scanf("%d", &cmp_count) && cmp_count) {
        scanf("%s", bst);
        while (cmp_count--) {
            scanf("%s", bst_cmp);
            //判断是否是一样的bst函数
            printf("%s\n", is_same_bst(bst, bst_cmp, 
                strlen(bst)) ? "YES" : "NO");
        }
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ACM算法日常 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5.1二叉搜索树基础
树(Tree)是n(n>=0)个节点的有限集。n=0时称为空树。在任意一颗非空树中:
wfaceboss
2019/04/09
5840
二叉搜索树
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83033069
zy010101
2019/05/25
4910
C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。
Enjoy233
2019/03/05
5810
C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
【C++】二叉搜索树
二叉搜索树又称二叉排序树,可以简写成 BST,它或者是一棵空树,或者是具有以下性质的二叉树:
YoungMLet
2024/03/01
1310
【C++】二叉搜索树
数据结构-二叉搜索树
这是无量测试之道的第159篇原创 思考   在n个动态的整数中搜索某个整数?(查看其是否存在)   假设使用动态数组存放元素,从第 0 个位置开始遍历搜索,平均时间复杂度:O(n)。如果维护一个有序
Wu_Candy
2022/07/04
2160
数据结构-二叉搜索树
二叉搜索树
二叉树(Binary tree) 二叉搜索树(Binary Search Tree) 什么是二叉搜索数? 二叉搜索树,又成二叉查找树,二叉排序树。 若任意结点的左子树不空,则左子树上所有结点的值都不大于它的根结点的值。 若任意结点的右子树不空,则右子树上所有结点的值都不小于它的根结点的值。 任意结点的左、右子树也分别为二叉搜索树 复杂度 如果有n个元素,则复杂度为:O(logn) 方法 插入 // 二叉搜索树(Binary Search Tree) function BinarySearchTree()
hss
2022/02/25
3000
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家 谱、单位的组织架构、等等。 树是由n(n>=1)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就 是说它是根朝上,而叶朝下的。
看、未来
2020/08/25
1.2K0
种树:二叉树、二叉搜索树、AVL树、红黑树、哈夫曼树、B树、树与森林
【C++课程学习】:二叉搜索树
因为搜索二叉树也是二叉树,要定义左右两个节点指针。此时先以K树讲解。此时的节点结构为:
用户11396661
2024/12/09
1120
【C++课程学习】:二叉搜索树
经典算法之二叉搜索树
二叉树(Binary Tree)是一种特殊的树类型,其每个节点最多只能有两个子节点。这两个子节点分别称为当前节点的左孩子(left child)和右孩子(right child)。
用户3467126
2019/11/26
7700
C++二叉搜索树
【C++进阶学习】二叉树搜索树 零、前言 一、二叉搜索树概念 二、二叉搜索树的详解及模拟 1、二叉搜索树的结构 2、二叉树搜索树的构造和析构 3、二叉搜索树的查找 4、二叉搜索树的插入 5、二叉搜索树的删除 三、二叉搜索树的应用 零、前言 我们都知道二叉树只有附加上一些特性才具有实用的价值,而本章主要讲解二叉树进阶的内容-二叉搜索树 一、二叉搜索树概念 概念: 二叉搜索树(Binary Search Tree)又称二叉排序树,也称作二叉查找树它或者是一棵空树,或者是具有以下性质的二叉树 若
用户9645905
2022/11/30
3090
C++二叉搜索树
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。本文将介绍如何使用Java实现二叉查找树,并实现常见的操作。
修己xj
2025/03/12
1310
算法系列之数据结构-二叉搜索树
二叉搜索树模拟实现
二叉搜索树(BST,Binary Search Tree)又称二叉排序树,二叉查找树,主要功能是排序,去重,查找一个值是否存在。
咬咬
2024/06/12
910
二叉搜索树模拟实现
【C++】从零开始构建二叉搜索树
普通的二叉树没有特别的性质,今天我们就来赋予其一个全新的性质来满足高速搜索的需求 ,并为后序的map与set做铺垫 ,二叉搜索树的特性了解,有助于更好的理解map和set的特性
叫我龙翔
2024/05/26
1290
【C++】从零开始构建二叉搜索树
二叉查找树
二叉查找树 (Binary Search Tree) 是按照平衡顺序排列的二叉树, 也称二叉搜索树、 有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。
beginor
2020/08/10
3920
二叉查找树
【C++高阶】二叉搜索树的全面解析与高效实现
二叉搜索树(BST,Binary Search Tree)又称二叉排序树,是一种特殊的二叉树,它或者是一棵空树,或者是具有以下性质的二叉树:
IsLand1314
2024/10/15
1290
【C++高阶】二叉搜索树的全面解析与高效实现
TypeScript算法题实战——二叉搜索树篇
推荐文章:《Spring AI中的卷积神经网络(CNN):深度解析与Java实现》
中杯可乐多加冰
2024/12/08
1220
【c++】二叉搜索树(BST)
每个节点有两个指针,分别指向它的左子节点和右子节点。如果子节点不存在,则这些指针为nullptr
用户11029103
2024/05/24
920
【c++】二叉搜索树(BST)
什么是二叉搜索树
二叉搜索树是一种综合效率比较好的一种数据结构,搜索、插入、删除的复杂度等于树高, 平均空间复杂度为O(n),时间复杂度为O(log n),最坏时间复杂度为O(n),(当插入的数列有序,导致二叉树退化为线性表),故一些其他的树,在二叉搜索树基础上进行改良的平衡树,如AVL树、红黑树等,可以使得树的高度总是得到平衡,从而使得最坏的情况下,时间复杂度也能达到O(log n)。
我是攻城师
2019/04/28
1.1K0
什么是二叉搜索树
二叉搜索树
二叉搜索树(Binary Search Tree)的定义: 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树。 这个是百度百科上的一个定义,个人认为还是比较易懂的,简单点来说二叉搜索树就是要么是一个空空树,要么是一棵二叉树,如果存在左子树,那么左子树上的所有节点的值都小于根节点的值,如果存在右子树,那么右子树的所有节点的值都大于根节点的值,并且左右子树都是二叉搜索树。 好吧,不管我解释的清不清楚,下面来看一张图就知道了:
指点
2019/01/18
1K0
二叉搜索树
【深入C++】二叉搜索树
二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树,其每个节点最多有两个子节点,分别称为左子节点和右子节点。BST具有以下性质:
用户11305458
2024/10/09
1300
【深入C++】二叉搜索树
相关推荐
5.1二叉搜索树基础
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验