二叉树详解及二叉树的遍历(递归与非递归C++算法实现)

2023-05-16

二叉树详解及二叉树的遍历(递归与非递归C++算法实现)

二叉树简介

树(Tree)

是一种由多个节点组成的有限集合T,有且仅有一个节点称为根(root),其余结点分为m(大于等于0)个互不相交的有限集合T1,T2,T3…;每个集合本身又是棵树,被称为这个根的子树。

在树的定义中规定了树含有结点数必须大于0,这表明空集不可以称为树;他又规定结点可以为1,该结点就是根节点。

节点、根节点、父节点、子节点、兄弟节点
② 一棵树可以没有任何节点,成为空树
③ 一棵树可以只有1个节点,也就是只有根节点
④ 子树、左子树、右子树
⑤ 节点的度(degree):子树的个数
⑥ 树的度:所有节点度中的最大值
⑦ 叶子节点(leaf): 度为0的节点
⑧ 非叶子节点:度不为0的节点

树的存储结构

  1. 结点异构型

根据结点的子树数设置相应的指针域,同时在结点的数据中再增加一个表示结点的度的域,以了解这个结点具有的指针域。

  1. 结点同构型

以这棵树的度作为结点的指针域数目,每个结点的长度一样,但是树中很多结点的度小于树的度,导致存储浪费。

二叉树(Binary Tree)

二叉树的特点

  • 每个节点的度最大为2(最多拥有2棵子树)
  • 左子树和右子树是有顺序的
  • 即使某节点只有一颗子树,也要区分左右子树。

二叉树具有五种基本形态:

  • 空二叉树。
  • 只有一个根节点
  • 根节点只有左子树
  • 根节点只有右子树
  • 根节点既有左子树又有右子树。

满二叉树

在一棵二叉树中。如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树称为满二叉树。
满二叉树的特点有:

  • 叶子只能出现在最下一层。出现在其它层就不可能达成平衡。
  • 非叶子结点的度一定是2。
  • 在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多

在这里插入图片描述

完全二叉树

对一颗具有n个结点的二叉树按层编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这棵二叉树称为完全二叉树。

在这里插入图片描述

二叉树的基本性质

  1. 二叉树的第i层至多有2^(n-1)个结点;

  2. 深度为k的二叉树至多有2^k - 1个结点

  3. 对任意一颗二叉树,若2度结点数为N2 ,则叶子数为 N0 = N2 + 1;

完全二叉树的重要性质:

  1. 在完全二叉树中,具有n个节点的完全二叉树的深度为[log2n]+1,其中[x]是向下取整。
  2. 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点有如下特性:
(1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点;
(2) 若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点;
(3) 若 2i+1>n,则该结点无右孩子结点, 否则,编号为2i+1 的结点为其右孩子结点。

二叉树的遍历(递归与非递归C++算法实现)

先序遍历

先访问根结点A,然后访问左子树B,以左子树结点B为根结点,继续,先访问左子树根结点B,再访问B的左子树结点C,如果没有左子树,则访问右子树结点D,然后继续照此遍历树中所有结点。

遍历顺序:

  • 先访问根结点
  • 先序遍历左子树
  • 先序遍历右子树

在这里插入图片描述

在这里插入图片描述

/**
 * 非递归实现先序遍历
 * 先访问根结点,再访问左子树,再访问右子树
 * @param root 根结点
 */
void pre_traversal(BTreeNode* root) {
    stack<BTreeNode*> node_stack;       //用来暂存节点的栈
    while (root != nullptr || !node_stack.empty()) {
        if (root != nullptr) {                     //若当前的节点非空,
            cout << root->val << " ";         //则输出该节点的值
            node_stack.push(root);                 //该节点压入栈中。
            root = root->leftchild;                // 我们继续向左子树前进
        }
        else {
            root = node_stack.top();
            node_stack.pop();
            root = root->rightchild;
        }
    }
}


/**
 * 递归实现先序遍历
 * 先访问根结点,再访问左子树,再访问右子树
 * @param root 根结点
 */
void PreOrder(BTreeNode* root){
    if(root!=NULL){
        visit(root);
        PreOrder(root->leftchild);
        PreOrder(root->rightchild);
    }
}

中序遍历

同先序遍历类似,只不过这里先访问的左子树结点,在访问根结点

按照以下顺序进行遍历

  • 中序遍历左子树
  • 访问根结点
  • 中序遍历右子树

在这里插入图片描述

/**
 * 非递归实现中序遍历
 * 先访问左子树,再访问根结点,再访问右子树
 * 通过栈来存储二叉树结点
 * @param root 根结点
 */
void in_traversal(BTreeNode* root) {
    stack<BTreeNode*> stack_node;
    while (root != nullptr || !stack_node.empty()) {
        if (root != nullptr) {
            stack_node.push(root);
            root = root->leftchild;
        }
        else {
            root = stack_node.top();
            cout << root->val << " ";
            stack_node.pop();
            root = root->rightchild;
        }
    }
}

/**
 * 递归实现中序遍历
 * 先访问左子树,再访问根结点,再访问右子树
 * @param root 根结点
 */
void InOrder(BTreeNode* root){
    if(root!=NULL){
        InOrder(root->leftchild);
        visit(root);
        InOrder(root->rightchild);
    }
}

后序遍历

按照以下顺序进行遍历

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根节点

在这里插入图片描述

/**
 * 非递归实现后序遍历
 * 先访问左子树,再访问右子树,再访问根结点
 * 通过栈来存储二叉树结点
 * @param root 根结点
 */
void post_traversal(BTreeNode* root) {
    stack<BTreeNode*> stack_node;
    BTreeNode* lastvisit = root;
    while (root != nullptr || !stack_node.empty()) {
        if (root != nullptr) {
            stack_node.push(root);
            root = root->leftchild;
        }
        else {
            root = stack_node.top();
            if (root->rightchild == nullptr || root->rightchild == lastvisit) {

                cout << root->val << " ";
                stack_node.pop();
                lastvisit = root;
                root = nullptr;
            }
            else {
                root = root->rightchild;
            }
        }
    }
}

/**
 * 递归实现后序遍历
 * 先访问左子树,再访问右子树,再访问根结点
 * @param root 根结点
 */
void PostOrder(BTreeNode* root){
    if(root!=NULL){
        PostOrder(root->leftchild);
        PostOrder(root->rightchild);
        visit(root);
    }
}

层次遍历

从根节点开始,一层一层,从上到下,每层从左到右,依次遍历下去。

void LevelOrder(BTreeNode* root){
    BTreeNode* p; // 创建辅助队列
    queue<BTreeNode*> q;
    q.push(root); //根结点入队
    while(!q.empty()){
        p = q.front();
        visit(p);//访问结点
        q.pop(); //对头结点出队
        if(p->leftchild!=NULL){
            q.push(p->leftchild);
        }
        if(p->rightchild!=NULL){
            q.push(p->rightchild);
        }
    }
}

遍历总结

结果:

通过二叉树遍历规律得出的结果如下图所示:

在这里插入图片描述

练习:

这里给出另外一个二叉树及其先中后序遍历及层次遍历的结果,可以试着自己遍历试试看,是否得到同样的结果。
在这里插入图片描述

代码实现

通过运行代码实现效果如下所示:

在这里插入图片描述

完整代码

//
// Created by caifl on 12/7/2021.
//
/**
 * 二叉树的先序、中序、后序、层序遍历思路及算法实现
 */

#include "iostream"
#include "vector"
#include "stack"
#include "queue"
using namespace std;

struct BTreeNode { //二叉树结点
    int val;
    BTreeNode* leftchild; //左子树结点
    BTreeNode* rightchild; //右子树结点
    // 二叉树结点结构体构造函数
    BTreeNode(char const& _val, BTreeNode* _leftchild=NULL, BTreeNode* _rightchild=NULL) :
            val(_val), leftchild(_leftchild), rightchild(_rightchild) {}
};

/**
 * 访问结点值
 * @param node 树结点
 */
void visit(BTreeNode* node){
    cout<<char(node->val)<<" ";
}

/**
 * 非递归实现先序遍历
 * 先访问根结点,再访问左子树,再访问右子树
 * @param root 根结点
 */
void pre_traversal(BTreeNode* root) {
    stack<BTreeNode*> node_stack;       //用来暂存节点的栈
    while (root != nullptr || !node_stack.empty()) {
        if (root != nullptr) {                     //若当前的节点非空,
            visit(root);      //则输出该节点的值
            node_stack.push(root);                 //该节点压入栈中。
            root = root->leftchild;                // 我们继续向左子树前进
        }
        else {
            root = node_stack.top();
            node_stack.pop();
            root = root->rightchild;
        }
    }
}

/**
 * 非递归实现中序遍历
 * 先访问左子树,再访问根结点,再访问右子树
 * 通过栈来存储二叉树结点
 * @param root 根结点
 */
void in_traversal(BTreeNode* root) {
    stack<BTreeNode*> stack_node;
    while (root != nullptr || !stack_node.empty()) {
        if (root != nullptr) {
            stack_node.push(root);
            root = root->leftchild;
        }
        else {
            root = stack_node.top();
            visit(root);
            stack_node.pop();
            root = root->rightchild;
        }
    }
}

/**
 * 非递归实现后序遍历
 * 先访问左子树,再访问右子树,再访问根结点
 * 通过栈来存储二叉树结点
 * @param root 根结点
 */
void post_traversal(BTreeNode* root) {
    stack<BTreeNode*> stack_node;
    BTreeNode* lastvisit = root;
    while (root != nullptr || !stack_node.empty()) {
        if (root != nullptr) {
            stack_node.push(root);
            root = root->leftchild;
        }
        else {
            root = stack_node.top();
            if (root->rightchild == nullptr || root->rightchild == lastvisit) {

                visit(root);
                stack_node.pop();
                lastvisit = root;
                root = nullptr;
            }
            else {
                root = root->rightchild;
            }
        }
    }
}



/**
 * 递归实现先序遍历
 * 先访问根结点,再访问左子树,再访问右子树
 * @param root 根结点
 */
void PreOrder(BTreeNode* root){
    if(root!=NULL){
        visit(root);
        PreOrder(root->leftchild);
        PreOrder(root->rightchild);
    }
}

/**
 * 递归实现中序遍历
 * 先访问左子树,再访问根结点,再访问右子树
 * @param root 根结点
 */
void InOrder(BTreeNode* root){
    if(root!=NULL){
        InOrder(root->leftchild);
        visit(root);
        InOrder(root->rightchild);
    }
}

/**
 * 递归实现后序遍历
 * 先访问左子树,再访问右子树,再访问根结点
 * @param root 根结点
 */
void PostOrder(BTreeNode* root){
    if(root!=NULL){
        PostOrder(root->leftchild);
        PostOrder(root->rightchild);
        visit(root);
    }
}

/**
 * 层次遍历二叉树
 */
void LevelOrder(BTreeNode* root){
    BTreeNode* p; // 创建辅助队列
    queue<BTreeNode*> q;
    q.push(root); //根结点入队
    while(!q.empty()){
        p = q.front();
        visit(p);//访问结点
        q.pop(); //对头结点出队
        if(p->leftchild!=NULL){
            q.push(p->leftchild);
        }
        if(p->rightchild!=NULL){
            q.push(p->rightchild);
        }
    }
}


/**
 * 测试方法
 */
void test(){
    //构建二叉树
    BTreeNode* A = new BTreeNode('A');
    BTreeNode* B = new BTreeNode('B');
    BTreeNode* C = new BTreeNode('C');
    BTreeNode* D = new BTreeNode('D');
    BTreeNode* E = new BTreeNode('E');
    BTreeNode* F = new BTreeNode('F');
    BTreeNode* G = new BTreeNode('G');
    BTreeNode* H = new BTreeNode('H');
    BTreeNode* I = new BTreeNode('I');
    BTreeNode* J = new BTreeNode('J');
    BTreeNode* K = new BTreeNode('K');
    A->leftchild=B;
    A->rightchild=C;
    B->leftchild=D;
    B->rightchild=E;
    C->leftchild=F;
    C->rightchild=G;
    D->leftchild=H;
    D->rightchild=I;
    E->rightchild=J;
    F->rightchild=K;

    /**
     * 非递归实现
     */
	cout<<"非递归实现:"<<endl << "Pre order traversal:" << endl;
	pre_traversal(A); //先序遍历
	cout << endl<< "In order traversal:" << endl;
	in_traversal(A);  //中序遍历
	cout << endl << "Post order traversal:" << endl;
	post_traversal(A); //后序遍历

    /**
     * 递归实现
     */
    cout<<endl<<"递归实现"<<endl;
    cout<<"先序遍历:"<<endl;
    PreOrder(A);
    cout<<endl<<"中序遍历:"<<endl;
    InOrder(A);
    cout<<endl<<"后序遍历:"<<endl;
    PostOrder(A);

    //层次遍历
    cout<<endl<<"层次遍历:"<<endl;
    LevelOrder(A);

}

Reference

https://blog.csdn.net/chinesekobe/article/details/110874773

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树详解及二叉树的遍历(递归与非递归C++算法实现) 的相关文章

  • 【Java】反射时获取父类属性并赋值

    1 反射获取父类 在反射获取类里的所有属性的时候 xff0c 会遇到无法访问父类extends里面的值 这时候需要访问父类需要调用Class的方法getSuperclass 对父类进行遍历field 同时如果不想遍历到Object或者某个类
  • linux软件包安装命令——apt-get

    apt get是linux中APT软件包的管理工具 采用shell命令行的方式完成软件的安装 更新 卸载等操作 1 语法 apt get xff08 选项 xff09 xff08 参数 xff09 选项 xff1a c 指定配置文件 o 直
  • 浅谈路由器的wan、lan、wlan口和vlan/trunk口

    背景 另一篇博文分析了一个实际的路由问题 xff0c 为方便问题分析 xff0c 在此列出常用概念 vlan中的trunk口 VLAN Trunk以及三层交换 可以把switch某一端口设为trunk 端口 问题 IP地址分类 xff1a
  • bzoj4864 [BeiJing 2017 Wc]神秘物质

    http www elijahqi win 2018 01 26 bzoj4864 beijing 2017 wc E7 A5 9E E7 A7 98 E7 89 A9 E8 B4 A8 20 E2 80 8E Description 21
  • mysql8设置远程连接详细教程

    这是转载StackOverFlow上的回答 xff0c 原回答点此这里 Remote Access in MySQL 8 Allow access from any host sudo nano etc mysql mysql conf d
  • 倒水问题(bfs)

    题意概述 34 fill A 34 表示倒满A杯 xff0c 34 empty A 34 表示倒空A杯 xff0c 34 pour A B 34 表示把A的水倒到B杯并且把B杯倒满或A倒空 Input 输入包含多组数据 每组数据输入 A B
  • A-化学

    题目概述 假设如上图 xff0c 这个烷烃基有6个原子和5个化学键 xff0c 6个原子分别标号1 6 xff0c 然后用一对数字 a b 表示原子a和原子b间有一个化学键 这样通过5行a b可以描述一个烷烃基 你的任务是甄别烷烃基的类别
  • B-评测系统

    题目概述 例如某次考试一共八道题 xff08 A B C D E F G H xff09 xff0c 每个人做的题都在对应的题号下有个数量标记 xff0c 负数表示该学生在该题上有过的错误提交次数但到现在还没有AC xff0c 正数表示AC
  • week4_C TT的神秘礼物

    题目描述 TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM 就会买一只可爱猫咪送给 TT
  • week8_C 班长竞选(Kosaraju算法 SCC缩点)

    题目描述 大学班级选班长 xff0c N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适 xff0c 意见具有传递性 xff0c 即 A 认为 B 合适 xff0c B 认为 C 合适 xff0c 则 A 也认为 C 合
  • week15实验 D_瑞瑞爱上字符串/F_东东:“来不及解释了,快上车!!”

    D 瑞瑞爱上字符串 题目 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61
  • CSP-M4补题 A_TT数鸭子

    题目 这一天 xff0c TT因为疫情在家憋得难受 xff0c 在云吸猫一小时后 xff0c TT决定去附近自家的山头游玩 TT来到一个小湖边 xff0c 看到了许多在湖边嬉戏的鸭子 xff0c TT顿生羡慕 此时他发现每一只鸭子都不 一样
  • 第二道月模csp201604-3 路径解析

    题目 在操作系统中 xff0c 数据通常以文件的形式存储在文件系统中 文件系统一般采用层次化的组织形式 xff0c 由目录 xff08 或者文件夹 xff09 和文件构成 xff0c 形成一棵树的形状 文件有内容 xff0c 用于存储数据
  • 第三道月模csp201609-3炉石传说

    题目 炉石传说 xff1a 魔兽英雄传 xff08 Hearthstone Heroes of Warcraft xff0c 简称炉石传说 xff09 是暴雪娱乐开发的一款集换式卡牌游戏 xff08 如下图所示 xff09 游戏在一个战斗棋
  • 第四道月模csp201809-3 元素选择器

    题目背景 题目描述 输入输出 Input Output Sample Input Sample Output 数据规模和约定 思路分析 根据题意 xff0c 创建element结构体 xff0c 新建element类型数组e xff0c 用
  • Debian设置合上笔记本盖子不休眠

    序言正文 序言 在使用的debian的时候 xff0c 发现在哪都找不到设置合上笔记本盖子不做任何事情的选项 xff0c 不像Ubuntu可以在电源里设置 在这里介绍编辑Login Manager 的配置文件 xff08 logind co
  • 学生认证免费领取——使用阿里云服务器的Ubuntu版本,并进行图形化

    一 前言 我们学习和工作中经常需要使用Linux系统来跑程序 我们可以使用虚拟机装一个Ubuntu镜像 当然我们为了方便也可以使用阿里云的服务器 二 获取服务器 1 到阿里云官网 没有账号的同学注册一个就OK 2 搜索框搜索 学生优惠 3
  • Python Pyside/Pyqt 禁止拉伸窗体

    可能是搜索姿势不正确 xff0c 搜了半天没搜到正确答案 随手做个笔记 值可以写死 xff0c 但是一改UI又要重新改这 xff0c 太麻烦 xff0c 索性 加载UI文件时 def init self 对ui文件进行加载 self ui
  • Win10 编译运行Fortran77程序,开发环境搭建

    有个朋友说我讲的blas中的fortran语法有个地方不正确 xff0c 非说他自己的理解是对的 怎么肯能 xff0c f77都看了十几年了 拿出证据来才行 xff0c 朋友却说自己不知道怎么编译f77程序 好吧 xff0c 那还这么自信呀
  • C++ time(0)函数

    time 0 函数返回当前格林尼治标准时间与格林尼治标准时间1970年0分0秒的时间间隔 头文件 include lt ctime gt 问题 xff1a 得到当前时间 include lt iostream gt include lt c

随机推荐

  • 位运算左移、右移、按位取反

    目录 一 异或习题补充 1 260 只出现一次的数字 III 力扣 xff08 LeetCode xff09 二 位运算左移 1 概念 1 xff09 二进制形态 2 xff09 执行结果 3 xff09 负数左移的执行结果 4 xff09
  • 远程客户端无法连接到ubuntu

    检查SSH是否安装 xff1a ssh localhost 通过APT的安装命令非常方便 xff1a sudo apt install openssh server
  • 使用python读写内存–植物大战僵尸为例 pymem和tkinter

    使用python读写内存 植物大战僵尸为例 pymem和tkinter 废话不多 xff0c 直接上源代码 span class token keyword import span tkinter span class token keyw
  • Paramiko: Python使用paramiko连接主机报错“Authentication timeout”

    问题描述 xff1a 在用Python Paramiko库去连接主机时 始终无法连接 xff0c exception输出错误仅有 Authentication timeout connection 61 paramiko SSHClient
  • 流感传染

    题目描述 有一批易感人群住在网格状的宿舍区内 xff0c 宿舍区为n n的矩阵 xff0c 每个格点为一个房间 xff0c 房间里可能住人 xff0c 也可能空着 在第一天 xff0c 有些房间里的人得了流感 xff0c 以后每天 xff0
  • 获取B站某用户更多的关注数和粉丝数

    获取B站某用户更多的关注数和粉丝数 相关记录 一 前言 B 站最多只能翻 5 页用户的关注数和粉丝数 xff0c 如何能够看到更多呢 方法我也是从网上翻来的 xff0c 记载博客里 xff0c 算是我研究过这个话题了 二 需要的东西 关注数
  • HDU 1692 Destroy the Well of Life-卡时间-(枚举+剪枝)

    题意 xff1a 有n口井 xff0c 编号为1到n xff0c 打破第i口井需要p i 的能量 xff0c 但是只要井被打破里面的水会流到下一口井 xff0c 只要一口井的井水w i 多余一个上限l i 会自动打破 xff0c 求打破第n
  • 一.前言——人类是不是机器人

    一 前言 人类是不是机器人 随着时代的进步 xff0c 人工智能诞生了 又随着人工智能的进步 xff0c ChatGPT诞生了 xff0c 这不仅让我想出一个问题 xff1a 我们人类是不是机器人 xff1f ChatGPT xff0c 发
  • CCF期末预测之最佳阈值

    题目背景 考虑到安全指数是一个较大范围内的整数 小菜很可能搞不清楚自己是否真的安全 xff0c 顿顿决定设置一个阈 xff0c 以便将安全指数 y转化为一个具体的预测结果 会挂科 或 不会挂科 因为安全指数越高表明小菜同学挂科的可能性越低
  • (IOS系列)——TextFile属性设置

    初始化textfield并设置位置及大小 UITextField text 61 UITextField alloc initWithFrame CGRectMake 20 20 130 30 设置边框样式 xff0c 只有设置了才会显示边
  • windows10系统自带linux子系统(WSL)的安装目录

    如题 xff0c 最近一直想能不能不用VM virtualbox Hyper V等以虚拟机方式在windows10系统中安装linux xff0c 以便打造openwrt编译环境 在网上摸索了许久 xff0c 终于找到了一种方法 xff0c
  • 智慧农业IOT-onenet平台简单介绍

    智慧农业IOT onenet平台简单介绍 1 onenet平台简介 1 1 onenet简介 OneNET是由中国移动打造的PaaS物联网开放平台 平台能够帮助开发者轻松实现设备接入与设备连接 xff0c 快速完成产品开发部署 xff0c
  • 万物互联-stm32单片机简介、烧录、编程及其项目环境搭建

    万物互联 stm32单片机简介 烧录 编程 前言 xff1a stm32单片机这里给出简单介绍 xff0c 给不了解的朋友普及下硬件端的基本知识 xff0c 叙述的较为简单 xff0c 想深入研究的朋友可以去一些官方网站 论坛 博客汲取知识
  • 万物互联-IOT-ESP8266功能、作用、AT、连接onenet服务器简单介绍

    万物互联 IOT ESP8266功能 作用 AT 连接onenet服务器简单介绍 1 ESP8266简介 1 1 ESP8266简介 ESP8266是一个完整且自成体系的 WiFi 网络解决方案 xff0c 能够独立运行 xff0c 也可以
  • 云应用系统开发技术考点(面试题相关)

    云应用系统开发技术考点 xff08 面试题相关 xff09 1 CAP理论 概述 xff1a 一个分布式系统最多只能同时满足一致性 xff08 Consistency xff09 可用性 xff08 Availability xff09 和
  • Linux常用命令大全(超详细分类版)

    Linux常用命令大全 xff08 持续收集 分类 xff09 文件操作 常用 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 进入个人的主目录 cd user1 进入个人的主目录
  • 图的基本概念、存储及基本操作(邻接矩阵法与邻接表法)

    图的基本概念 存储及基本操作 邻接矩阵法与邻接表法 xff09 1 图的基本概念 1 1 图的定义 图 xff08 Graph xff09 是由顶点的有穷非空集合和顶点之间边的集合组成 xff0c 通常表示为 xff1a G V E xff
  • 深度优先搜索(DFS)与广度优先搜索(BFS)算法详解

    深度优先搜索 xff08 DFS xff09 与广度优先搜索 xff08 BFS xff09 详解 1 广度优先搜索算法 1 1 前言 和树的遍历类似 xff0c 图的遍历也是从图中某点出发 xff0c 然后按照某种方法对图中所有顶点进行访
  • 小程序微服务单个SSL证书部署多个项目解决方案

    小程序微服务单个SSL证书部署多个项目解决方案 玩过小程序的人 xff0c 都知道小程序上线的要求比较苛刻 xff0c 并不是上架审核苛刻 xff0c 而是前期的服务器上架比较麻烦 xff0c 需要配置SSL证书 xff0c 并且只能使用8
  • 二叉树详解及二叉树的遍历(递归与非递归C++算法实现)

    二叉树详解及二叉树的遍历 xff08 递归与非递归C 43 43 算法实现 xff09 二叉树简介 树 xff08 Tree xff09 是一种由多个节点组成的有限集合T xff0c 有且仅有一个节点称为根 xff08 root xff09