2024/2/1 备战蓝桥杯 3-3 二叉树

目录

二叉树的遍历

B3642 二叉树的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

完全二叉树的权值

0完全二叉树的权值 - 蓝桥云课 (lanqiao.cn)

美国血统 American Heritage

P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

求先序排列

P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


二叉树的遍历

B3642 二叉树的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:

明白二叉树三种遍历方式:

先序遍历:根,左,右

中序遍历:左,根,右

后续遍历:左,右,根

完整代码:

#include 
#define int long long
const int N = 1e6+10;
int p[N];
struct node
{
    int v;
    int ls,rs;
}t[N];
void preorder(int u)//先序遍历
{
    if(u!=0)
    {
        std::cout<> n;
    for(int i = 1;i <= n;i ++)
    {
        int x,y;
        std::cin >> x >> y;
        t[i].v=i;
        t[i].ls=x;
        t[i].rs=y;
    }
    preorder(1);
    std::cout<<"\n";
    midorder(1);
    std::cout<<"\n";
    postorder(1);
    std::cout<<"\n";
    return 0;
}

完全二叉树的权值

0完全二叉树的权值 - 蓝桥云课 (lanqiao.cn)

思路:用一个数组存每一层二叉树的权值,再比较哪一层的权值最大

ceil(log(i+1)/log(2)):这个公式用于计算二叉树的深度

完整代码:

#include 
#define int long long
const int N = 1e5+10;
int sum[N];
signed main()
{
    int n;
    std::cin >> n;
    for(int i = 1;i <= n;i ++)
    {
        int x;
        std::cin >> x;
        int d=ceil(log(i+1)/log(2));
        sum[d]+=x;
    }
    int maxx=-999;
    int ans=1;
    for(int i = 1;i <= N;i ++)
    {
        if(sum[i]>maxx)
        {
            maxx=sum[i];
            ans=i;
        }
    }
    std::cout<

美国血统 American Heritage

P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:递归

其他在代码的注释里面

这道题是输出后续遍历,后序是左右根,所以根在最后输出

完整代码:

#include 
#define int long long
std::string pre,inor;
void work(std::string pre,std::string inor)
{
    if(pre.empty()) //如果序列空了,就结束
        return;
    char root=pre[0];//取前序遍历的根节点
    int k = inor.find(root);//找到中序序列中根节点的位置
    pre.erase(pre.begin());//删除前序序列中的根节点
    std::string leftpre=pre.substr(0,k);
    std::string rightpre=pre.substr(k);
    std::string leftinor=inor.substr(0,k);
    std::string rightinor=inor.substr(k+1);
    work(leftpre,leftinor);
    work(rightpre,rightinor);
    std::cout<> inor >> pre;
    work(pre,inor);
    return 0;
}

求先序排列

P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:和前面一题类似,用递归

这道题是求先序排列

先序的顺序是根左右,所以得到根之后要先输出,在递归

完整代码:

#include 
#define int long long
std::string inor, last;

void work(std::string inor, std::string last) {
    if (last.empty())
        return;
    char root = last[last.size()-1];
    std::cout << root;
    last.pop_back();
    //last.erase(last[last.size()-1]);
    int k = inor.find(root);
    std::string leftinor = inor.substr(0, k);
    std::string rightinor = inor.substr(k + 1);
    std::string leftlast = last.substr(0, k);
    std::string rightlast = last.substr(k);
    work(leftinor, leftlast);
    work(rightinor, rightlast);
   // std::cout<> inor >> last;
    work(inor, last);
    return 0;
}

你可能感兴趣的:(寒假集训,蓝桥杯,算法,数据结构,蓝桥杯,c++,c语言)