首页 > 其他分享 >GPLT--BST

GPLT--BST

时间:2023-04-16 09:56:52浏览次数:47  
标签:return val -- define int GPLT NULL root BST

回顾下BST建树及相关性质

BST定义:

1、左子树的所有节点小于其根节点
2、右子树的所有节点大于其根节点
3、每个节点的左右子树也为二叉排序树
4、没有值相等的节点

BST性质之一:

中序遍历为有序序列

BST建树:

1、创建根节点
2、如果待插入的值小于该结点的左子节点,在该节点的左子树进行插入
3、如果待插入的值小于该结点的左子节点,在该节点的左子树进行插入

BST查找:

1、如果该结点的值等于val,则找到该节点
2、否则,若val小于该结点的值,查找其左子树
3、否则,若val大于该结点的值,查找其右子树
终止条件:该结点为空节点,或者找到该结点

完全二叉搜索树

  • 给定序列建树并输出层序遍历
  • 排序后进行中序遍历并赋值

实现:

#include <bits/stdc++.h>
using namespace std;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 2000010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
int T;
int n;
int len;
int a[N], res[N];
void dfs(int u)
{
    if (u > n)
        return;

    dfs(u << 1);
    res[u] = a[++len];
    dfs(u << 1 | 1);
}
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    sort(a + 1, a + 1 + n);

    dfs(1);

    for (int i = 1; i <= n; i++)
        cout << res[i] << (i == n ? "" : " ");
}
signed main()
{
    FAST;
    T = 1;
    // cin >> T;
    while (T--)
        solve();
    return 0;
}

是否完全二叉搜索树

  • 建树并判断是否为完全二叉数,层序遍历
  • 这里tp结点类,左右指针指向左右子结点

实现:

#include <bits/stdc++.h>
using namespace std;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 2000010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
int T;
int n, m;
int a[N];
typedef struct Node
{
    int val;
    struct Node *lson;
    struct Node *rson;
} *st, *tr;
void build(tr &root, int x)
{
    if (root == NULL)
    {
        root = new Node();
        root->val = x;
        return;
    }

    if (root->val > x)
        build(root->rson, x);
    else
        build(root->lson, x);
}
bool dfs(st a, tr b)
{
    if (a == NULL && b == NULL)
        return true;
    else if ((a == NULL && b != NULL) || (a != NULL && b == NULL))
        return false;
    else if (a->val == b->val)
        return dfs(a->lson, b->lson) && dfs(a->rson, b->rson);
    return false;
}
void solve()
{
    cin >> m;
    st u = NULL;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        build(u, a[i]);
    }

    while (m--)
    {
        tr root = NULL;
        for (int i = 1, x; i <= n; i++)
        {
            cin >> x;
            build(root, x);
        }

        if (dfs(u, root))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
}
signed main()
{
    FAST;
    T = 1;
    // cin >> T;
    while (cin >> n && n)
        solve();
    return 0;
}

是否为同一棵BST

  • 由插入序列判断是否为同一颗BST
  • 由标准插入序列建立标准BST,再由比较插入序列分别建立比较BST
  • dfs判断两者前序遍历是否相等

实现:

#include <bits/stdc++.h>
using namespace std;
#define mst(x, y) memset(x, y, sizeof x)
#define endl '\n'
#define INF LONG_LONG_MAX
#define int long long
#define Lson u << 1, l, mid
#define Rson u << 1 | 1, mid + 1, r
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
const int N = 2000010, MOD = 1e9 + 7;
const double EPS = 1e-6;
typedef pair<int, int> PII;
int T;
int n, m;
int a[N];
typedef struct Node
{
    int val;
    struct Node *lson;
    struct Node *rson;
} *st, *tr;
void build(tr &root, int x)
{
    if (root == NULL)
    {
        root = new Node();
        root->val = x;
        return;
    }

    if (root->val > x)
        build(root->rson, x);
    else
        build(root->lson, x);
}
bool dfs(st a, tr b)
{
    if (a == NULL && b == NULL)
        return true;
    else if ((a == NULL && b != NULL) || (a != NULL && b == NULL))
        return false;
    else if (a->val == b->val)
        return dfs(a->lson, b->lson) && dfs(a->rson, b->rson);
    return false;
}
void solve()
{
    cin >> m;
    st u = NULL;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        build(u, a[i]);
    }

    while (m--)
    {
        tr root = NULL;
        for (int i = 1, x; i <= n; i++)
        {
            cin >> x;
            build(root, x);
        }

        if (dfs(u, root))
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
}
signed main()
{
    FAST;
    T = 1;
    // cin >> T;
    while (cin >> n && n)
        solve();
    return 0;
}

标签:return,val,--,define,int,GPLT,NULL,root,BST
From: https://www.cnblogs.com/Aidan347/p/17322570.html

相关文章

  • 跟随 科普中国 学习
    科普中国文档说明:只记录关键地方;2023-04-11缘由:搜索知识,但是默认搜索引擎不太好用,总是找不到,找到记录一下笔记:收藏目录:科普中国车厘子到底是不是樱桃呢?今天带大家好好认识一下~列表科普中国科普中国微博......
  • Codeforces Round 866 (Div. 2) A~C
     这场,非常快落!是难得对中国选手友好的时间(17:05) A观察一下,发现在连续的___中插入^就好,然后特判一下首尾,发现很像小学奥数的那个植树问题哇(注意特判一下只有一个^#include<bits/stdc++.h>usingnamespacestd;voidsolve(){strings;cin>>s;intn=s.len......
  • 大门(我的世界)
    #include<iostream>#include"minecraft.h"TxMinecraftmc;usingnamespacestd;voidno1(intx,inty,intz){mc.drawLine(x,y+1,z,x,y+8,z,251,14);mc.drawLine(x,y,z-2,x,y,z+2,98,0);mc.setBlock(x,y,z,98,3);mc.setBlock(x,y+......
  • javaEE进阶小结与回顾(七)
    单元测试概述针对最小的功能单元(方法),编写测试代码对其进行正确性测试需要测试目前只能在main方法编写测试代码,去调用其他方法进行测试使用起来很不灵活,如果前面的方法测试有错,后面的方法就无法执行无法得到测试的报告,需要程序员自己去观察测试是否成功Jnuit单元测......
  • 七彩RGB可控模块教程
    一、硬件介绍七彩RGB可控模块,是个LED灯。但是它有三种颜色,分别为红、绿、蓝。该模块有四个接口,分别是Gnd、R、G、B。 二、控制原理通过PWM来控制LED灯的亮度,除此之外R、G、B、三个口要接三个不同的GPIO口。其实你也将RGB可控模块理解为三个不同颜色的LED灯。 三、......
  • 2023年4月16日09:03:49
    昨天就画了软件工程的图,其他没有干。昨天的画图过程中有一个问题,就是自己没有很专注的去画图,不然那个图应该可以早点完成。现在你的SpringBoot又学完了一遍,什么叫有,但没办法,确实是又,但我学的很快,也学到了很多跟以前不一样的东西,现在我又有一个个人“规律那就是我不断的学,不断的......
  • Mac版的Safari如何永久修改浏览器ua
    网上给的答案大多让你打开Safari的开发者,然后改用户代理换ua,一点用都没有,用一会儿就变回去了。这是永久的方法Mac的终端输入```bashdefaultswritecom.apple.SafariCustomUserAgent"\"Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/537.36(KHTML,likeGe......
  • VIM 命令
    vim默认模式:gg:首行GG:末行ngg:n是数字表示光标移到第n行j:向上(注意小写)k:向下(注意小写)h:向左(注意小写)l:向右(L的小写) yy或者YY:拷贝当前行nyy:n是数字 表示复制光标开始向后的n行(注意只能小写)p或者P:粘贴dd或者DD:剪切ndd:是数字 表示剪切光标开始向后的n行(注......
  • CF1815C
    1解法设\(f_i\)为\(i\)最多出现多少次,那么一个限制\((u,v)\)可以写成\(f_u\leqf_v+1\),把\(f\)看做最短路中的\(dis\)数组,上面的式子就是在图上连一条从\(u\)到\(v\)边权是\(1\)的边,由于边权都是\(1\),所以可以直接用\(\text{bfs}\)做.然后考虑如何构造使......
  • 【Spring Cloud】第二代Spring Cloud核心组件
    第一代SpringCloud(主要是 SpringCloudNetflix)很多组件已经进入停更维护模式。第二代SpringCloud核心组件主要以SpringCloudAlibaba为主,SpringCloudAlibaba是由一些阿里巴巴的开源组件和云产品组成的,2018年,SpringCloudAlibaba正式入住了SpringCloud官方孵化器......