个人学习编程(3-24) 数据结构

括号的匹配:

if((s[i]==')' && now=='(') || (s[i]==']' && now=='[')){

cpp 复制代码
#include <bits/stdc++.h>

using namespace std;

int main() {
    char s[300];
    scanf("%s",&s);
    int i;
    int len = strlen(s);
    stack <char> st;
    for (i = 0; i < len; i++)
    {
        if(!st.empty()){
            char now = st.top();
            if((s[i]==')' && now=='(') || (s[i]==']' && now=='[')){
                st.pop();
            }
            else{
                st.push(s[i]);
            }
        }
        else{
            st.push(s[i]);
        }
    }
    if (!st.empty())
    {
        printf("NO!");
    }
    else{
        printf("GOOD!");
    }
    return 0;
}

哈夫曼树(果堆排序):

有n堆果子,看看如何分类

输入包括两行:第一行是一个整数n(1<=n<=10000),表示果子的种类个数。

第二行包含了n个整数,用空格分隔,第i个整数表示整数ai(1<=ai<=20000)是第i堆果子的数目。

eg:输入 3

1 2 9

输出:15

解法1:

如果数量比较少,可以用sort函数来排序,每次将前面两位加完之后继续排,继续加,直到数组只有一个值。

解法2:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

struct node{
    int x;
    node(int a) {x = a;} //构造函数方便赋值
};

//定义优先队列的排序:
bool operator < (const node& a,const node& b){
    return a.x > b.x;
}

int main(){
    priority_queue <node> q;
    int n,x;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
         cin >> x;
         q.push(x);
    }
    int ans = 0;
    while (q.size() > 1)
    {
        node num1 = q.top();
        q.pop();
        node num2 = q.top();
        q.pop();
        ans += (num1.x + num2.x);
        q.push(node{num1.x + num2.x});
    }
    cout << ans;
    return 0;
    
}

其中的q.push(node{num1.x + num2.x}) 是前面把num1 出队和num2出队之前,把他们的值保存下来再相加

二叉树的建立和遍历:

按照先序先输入 二叉树的节点,没有的按0表示。

再输出 第一行是先序 第二行是中序 第三行是后序变量 第四输出叶子结点

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

typedef struct node{ //注意typedef不能忽略
    char data;
    struct node *lchild,*rchild;
}*BitTree;
//先序遍历的方式创建二叉树:
void CreatBitTree(BitTree &T){
    char c;
    cin >> c;
    if(c == '0'){
        T=NULL;
    }
    else{
        T = new node;
        T->data = c;
        CreatBitTree(T->lchild);
        CreatBitTree(T->rchild);
    }
}

//将二叉树按照先序输出:
void PreOrderTraverse(BitTree T){
    if(T != NULL){
        cout << T->data << ' ';
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

//将二叉树按照中序输出:
void InOrderTraverse(BitTree T){
    if (T != NULL)
    {
        InOrderTraverse(T->lchild);
        cout << T->data << ' ';
        InOrderTraverse(T->rchild);
    }
}

//将二叉树按照后序输出:
void PostOrderTraverse(BitTree T){
    if (T != NULL)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        cout << T->data << ' ';
    }
    
}

//二叉树的叶子节点数:
int Leaf(BitTree T){
    if(T == NULL) return 0;
    if(T->rchild == NULL && T->lchild == NULL) return 1;
    return Leaf(T->lchild) + Leaf(T->rchild);
}

//二叉树的深度:
int Deepth(BitTree T){
    if (T == NULL) return 0;
    int x = Deepth(T->lchild);
    int y = Deepth(T->rchild);
    return max(x,y) + 1;
}

int main() {
    BitTree T;
    CreatBitTree(T);
    PreOrderTraverse(T); cout << endl;
    InOrderTraverse(T); cout << endl;
    PostOrderTraverse(T); cout << endl;
    cout << Leaf(T) << endl;
    return 0;
}
相关推荐
黄鹂绿柳1 小时前
Vue+Vite学习笔记
vue.js·笔记·学习
勇闯逆流河5 小时前
【数据结构】堆
c语言·数据结构·算法
985小水博一枚呀6 小时前
【AI大模型学习路线】第二阶段之RAG基础与架构——第七章(【项目实战】基于RAG的PDF文档助手)技术方案与架构设计?
人工智能·学习·语言模型·架构·大模型
pystraf6 小时前
LG P9844 [ICPC 2021 Nanjing R] Paimon Segment Tree Solution
数据结构·c++·算法·线段树·洛谷
飞川撸码6 小时前
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
算法·leetcode·golang
yuhao__z7 小时前
代码随想录算法训练营第六十六天| 图论11—卡码网97. 小明逛公园,127. 骑士的攻击
算法
Echo``7 小时前
3:OpenCV—视频播放
图像处理·人工智能·opencv·算法·机器学习·视觉检测·音视频
hello1114-7 小时前
Redis学习打卡-Day3-分布式ID生成策略、分布式锁
redis·分布式·学习
小Tomkk7 小时前
2025年PMP 学习二十 第13章 项目相关方管理
学习·pmp·项目pmp
Nobkins7 小时前
2021ICPC四川省赛个人补题ABDHKLM
开发语言·数据结构·c++·算法·图论