有关二叉树的相关实现:建树,遍历(递归与非递归实现)

有关二叉树的相关实现:建树,遍历(递归与非递归实现)

定义二叉树的节点

struct BTNode {
    int data;
    BTNode *left;
    BTNode *right;
};

先序建立二叉树

思路:以数组中的元素先序构建二叉树,过程就是不断插入,直至数组中没有元素

// 先序建立二叉树
void insert_node(BTNode **root, int *data, int i) {
    if (i <= data[0]) {
        *root = new BTNode();
        (*root)->data = data[i];
        (*root)->left = NULL;
        (*root)->right = NULL;
        insert_node(&(*root)->left, data, 2 * i);
        insert_node(&(*root)->right, data, 2 * i + 1);
    }
}

遍历二叉树的操作,先序、中序、后续及层序遍历

递归实现二叉树的遍历

void pre_order(BTNode *root) {
    if (root != NULL) {
        cout << root->data << " ";
        pre_order(root->left);
        pre_order(root->right);
    }
}

void in_order(BTNode *root) {
    if (root != NULL) {
        in_order(root->left);
        cout << root->data << " ";
        in_order(root->right);
    }
}

void post_order(BTNode *root) {
    if (root != NULL) {
        post_order(root->left);
        post_order(root->right);
        cout << root->data << " ";
    }
}

非递归实现二叉树的遍历

先序遍历

void non_pre_order(BTNode *root) {
    stack<BTNode*> s;
    BTNode *cur = root;

    while (cur != NULL || !s.empty()) {
        while (cur != NULL) {
            cout << cur->data << " ";
            s.push(cur);
            cur = cur->left;
        }

        if (!s.empty()) {
            cur = s.top();
            s.pop();
            cur = cur->right;
        }
    }
}

中序遍历

void non_in_order(BTNode *root) {
    stack<BTNode*> s;
    BTNode *cur = root;

    while (cur != NULL || !s.empty()) {
        while (cur != NULL) {
            s.push(cur);
            cur = cur->left;
        }

        if (!s.empty()) {
            cur = s.top();
            s.pop();
            cout << cur->data << " ";
            cur = cur->right;
        }
    }
}

后序遍历

void non_post_order(BTNode *root) {
    stack<BTNode*> s1, s2;
    BTNode *cur = root;

    s1.push(cur);
    while (!s1.empty()) {
        cur = s1.top();
        s1.pop();
        s2.push(cur);

        if (cur->left != NULL)
            s1.push(cur->left);
        if (cur->right != NULL)
            s1.push(cur->right);
    }

    while (!s2.empty()) {
        cout << s2.top()->data << " ";
        s2.pop();
    }
}

层序遍历

void floor_order(BTNode *root) {
    queue<BTNode*> q;
    BTNode *cur;

    if (root != NULL)
        q.push(root);

    while (!q.empty()) {
        cur = q.front();
        cout << cur->data << " ";
        q.pop();

        if (cur->left != NULL)
            q.push(cur->left);
        if (cur->right != NULL)
            q.push(cur->right);
    }
}

测试代码

int main(void) {
    int data[] = {5, 1, 2, 3, 4, 5};
    BTNode *root = NULL;

    insert_node(&root, data, 1);

    // 先序遍历二叉树
    cout << "递归先序遍历二叉树" << endl;
    pre_order(root);
    cout << "\n非递归先序遍历二叉树\n";
    non_pre_order(root);
    cout << "\n递归中序遍历二叉树\n";
    // 中序遍历二叉树
    in_order(root);
    cout << "\n非递归中序遍历二叉树\n";
    non_in_order(root);
    cout << "\n递归后序遍历二叉树\n";
    // 后序遍历二叉树
    post_order(root);
    cout << "\n非递归后序遍历二叉树\n";
    non_post_order(root);
    cout << endl;
    // 层序遍历二叉树
    cout << "层序遍历二叉树\n";
    floor_order(root);
    cout << endl;

    return 0;
}

Read more

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现 决策树算法介绍:原理与案例实现 一、决策树算法概述 决策树是一种基本的分类与回归方法,它基于树形结构进行决策。决策树的每一个节点都表示一个对象属性的测试,每个分支代表该属性测试的一个输出,每个叶节点则代表一个类别或值。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。 二、决策树算法原理 1. 特征选择 特征选择是决策树学习的核心。它决定了在树的每个节点上选择哪个属性进行测试。常用的特征选择准则有信息增益、增益比和基尼不纯度。 * 信息增益:表示划分数据集前后信息的不确定性减少的程度。选择信息增益最大的属性作为当前节点的测试属性。 * 增益比:在信息增益的基础上考虑了属性的取值数量,避免了对取值数量较多的属性的偏好。 * 基尼不纯度:在CART(分类与回归树)算法中,使用基尼不纯度作为特征选择的准则。基尼不纯度越小,表示纯度越高。 2. 决策树的生成 根据选择的特征选择准则,从根节点开始,递归地为每个节点选择最优的划分属性,并根据该属性的不同取值建立子节点。直到满足停止条件(如所有样本属于同一类,

By Ne0inhk
他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

手机拍照不够爽,带个单反又太重? 试试做个树莓派复古相机,还能自己编写处理算法的那种—— 成本不到700元。 没错,颜值很高,拍出来的照片也能打: 你也可以快速上手做一个。 如何制作一个树莓派复古相机 目前,这部相机的代码、硬件清单、STL文件(用于3D打印)和电路图都已经开源。 首先是硬件部分。 这部复古相机的硬件清单如下: 树莓派Zero W(搭配microSD卡)、树莓派高清镜头模组、16mm 1000万像素长焦镜头、2.2英寸TFT显示屏、TP4056微型USB电池充电器、MT3608、2000mAh锂电池、电源开关、快门键、杜邦线、3D打印相机外壳、黑色皮革贴片(选用) 至于3D打印的相机外壳,作者已经开源了所需的STL文件,可以直接上手打印。 材料齐全后,就可以迅速上手制作了~ 内部的电路图,是这个样子的: 具体引脚如下: 搭建好后,整体电路长这样: 再加上3D外壳(喷了银色的漆)和镜头,一部简易的树莓派复古相机就做好了。 至于软件部分,

By Ne0inhk
🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk