11.31链表,之前的数据结构(未完,饼)

 根据输入序列建立二叉树

链表

回顾一下二分面积最小

一些性质题回顾

哈夫曼树构建

第十一周——哈夫曼树

11.31链表,之前的数据结构(未完,饼)_第1张图片

5
1 2 2 5 9

37

桶排序

#include 
#include 
#include 
#include
#include
#include 
#include
using namespace std;
//const int N = 10000;
//int arr[N];
//int search(int begin, int end, int target) {
//    if (begin > end) { return -1; }
//    int left = begin, right = end, mid = (left + right) >> 1;
//    while (left <= right) {
//        if (arr[mid] == target) {
//            return mid;
//        }
//        else if (arr[mid] < target) {
//            right = mid - 1;
//        }
//        else {
//            left = mid + 1;
//        }
//        mid = (left + right) >> 1;
//    }
//    return 0;
//}
//typedef struct node {
//    int data;
//    node* lchild, * rchild;
//}*tree;
//int high(tree root) {
//    if (root) {
//        return max(high(root->lchild), high(root->rchild)) + 1;
//    }
//    return 0;
//}
//int arr[100];
//int siz = 0;
//void shiftup(int child) {
//    int parent = (child - 1) / 2;
//    while (child > 0) {
//        if (arr[parent] >= arr[child]) {
//            break;//判断顶堆,就从堆顶到叶子结点走,如果任意一条路是递增的,那么就是小顶堆;
//            //如果任意一条路都是递减的,那么就是大顶堆。
//        }//如果父母结点比孩子结点大,就停止调整,这里是向上调整,所以向上是更大的,也就是顶上是最大的,所以是大顶堆
//        else {
//            swap(arr[parent], arr[child]);
//            child = parent;
//            parent = (child - 1) / 2;
//        }
//    }
//}
//void insert(int num) {
//    arr[siz++] = num;
//    shiftup(siz - 1);
//}
//
//void shiftdown(int parent) {
//    int child = parent * 2 + 1;
//    while (child <= size - 1) {
//        if (child + 1 <= size - 1 && arr[child + 1] > arr[child]) {
//            child++;
//        }
//        if (arr[parent] > arr[child]) {
//
//        }
//    }
//}
//int popheal() {
//    int num = arr[0];
//    swap(arr[0], arr[size - 1]);
//    size--;
//    shiftdown(0);
//    return num;
//}
//14 21 10 8 5 2
//12 10 8 7 6 3
//10 8 2 1 1 1
//const int N = 1e5 + 5;
//int arr[N];
//int n, m;
//bool check(int d) {
//    int num = 1, target = a[0] + d;
//    for (int i = 1; i < n; i++) {
//        if (arr[i] < target) {
//            continue;//这里不能放牛
//        }
//        num++;
//        target = arr[i] + d;
//    }
//    if (num >= m) {
//        return true;
//    }
//    else {
//        return false;
//    }
//}
//优先特点值小的那个,不能超过
//会产生不满意度
//目的是要输出不满意度
const int N = 10000 + 5, mod = 1e6;
typedef struct node {
    int ch[2], id;
    long long val;
}tree[N];
void rotate(int& cur, int f) {
    int son = tree[cur].ch[f];
    tree[cur].ch[f] = tree[son].ch[f ^ 1];
    tree[son].ch[f ^ 1] = cur;
    cur = son;
}
int tot;
void insert(int& cur, int val) {
    if (!cur) {
        cur = ++tot;
        tree[cur].val = val;
        tree[cur].id = rand();
        return;
    }
    int d = val > tree[cur].val;
    insert(tree[cur].ch[d], val);
    if (tree[tree[cur].ch[d]].id < tree[cur].id) {
        rotate(cur, d);
    }
}
int ls = tree[cur].ch[0], rs = tree[cur].ch[1];
void del(int& cur, int val) {
    if (!cur) { return; }
    if (val == tree[cur].val) {
        if (!tree[cur].ch[0] || !tree[cur].ch[1]) {
            cur = tree[cur].ch[0] + tree[cur].ch[1];
            return;
        }
        int d = tree[ls].id > tree[rs].val;
        rotate(cur, d);
        del(cur, val);
    }
    del(tree[cur].ch[val > tree[cur].val], val);
}
long long pred(int cur, int val) {
    if (!cur) {
        return 0;
    }
    if (val <= tree[cur].val) {
        return pred(ls, val);
    }
    return max(tree[cur].val, pred(rs, val));
}
long long nex(int cur, int val) {
    if (!cur) {
        return 0;
    }
    if (val >= tree[cur].val) {
        return nex(rs, val);
    }
    return min(tree[cur].val, nex(ls, val));
}
int s;
long long ans;
int main() {
    int n, rt = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int bz, x;
        cin >> bz >> x;
        if (bz == 0) {
            if (s <= 0) {
                insert(rt, x);
            }
            else {
                int k1 = pred(rt, x), k2 = nex(rt, x);
                int dele = k1;
                if (k2 - x < x - k1) {
                    dele = k2;
                }
                ans += abs(dele - x);
                ans %= mod;
                del(rt, dele);
            }
            s--;
        }
        else {
            if (s >= 0) {
                insert(rt, x);
            }
            else {
                int k1 = pred(rt, x), k2 = nex(rt, x);
                int dele = k1;
                if (k2 - x < x - k1) {
                    dele = k2;
                }
                ans += abs(dele - x);
                ans %= mod;
                del(rt, dele);
            }
            s++;
        }
    }
    cout << ans << endl;
    return 0;
}

之前的数据结构

第一次实验——模拟队列

第一次实验——括弧匹配

第一次实验——胡同

第一次实验——列车重拍

第六周习题——字符串匹配

第六周习题——后缀表达式

第三周习题——顺序表删除

第三周习题——寻找链表前驱节点

数据结构性质

队列,计算空满

11.31链表,之前的数据结构(未完,饼)_第2张图片

复习之前做过的题

第一次实验——倍数对

第六周习题——7-3

第二周习题——冰雹猜想

第一周习题——全排列

第一周习题——数雷,复习bfs

第二次实验——BFS

求叶子节点个数

new的时候这样即可,这里调用的就是结构体自身的构造函数;如果要传入值进行初始化,就需要重载一个带参的构造函数

递归建树的另一种写法

tree creat() {
    char ch;
    cin >> ch;
    tree root = new node;
    if (ch == '#') {
        root = nullptr;
    }
    else {
        root->data = ch;
        root->lchild = creat();
        root->rchild = creat();
    }
    return root;
}

    tree root = create(); 

总代码 

typedef struct node {
    char data;
    node* lchild, * rchild;
    //node(char x) :data(x), lchild(nullptr), rchild(nullptr) {}
    //node() :data(), lchild(nullptr), rchild(nullptr) {}
}*tree;
tree creat() {
    char ch;
    cin >> ch;
    tree root = new node;
    if (ch == '#') {
        root = nullptr;
    }
    else {
        root->data = ch;
        root->lchild = creat();
        root->rchild = creat();
    }
    return root;
}
int cntleaf(tree root) {//这里就直接传入tree,就表明是node的指针型
    if (root) {
        if (root->lchild || root->rchild) {
            return cntleaf(root->lchild) + cntleaf(root->rchild);
        }
        return 1;
    }
    return 0;
}
void pre(tree root) {
    if (root) {
        cout << root->data;
        pre(root->lchild);
        pre(root->rchild);
    }
}
int main() {
    tree root = create();
    pre(root);
    cout << endl;
    cout << cntleaf(root);
    return 0;
}

 求树的高度

int high(tree root) {
    if (root) {
        if (root->lchild || root->rchild) {
            return 1 + max(high(root->lchild), high(root->rchild));
        }
        else {
            return 1;
        }
    }
    return 0;
}

牛客网题复习

牛客网选择题

二叉树的一些定义,真、满、完全,还有一些计算公式

看一些文章进行复习

力扣题

你可能感兴趣的:(算法,算法)