二叉树--

1.建立并遍历二叉树

遍历顺序:

先序遍历,中序遍历,后序遍历

先序:先根后左右

中序:先左然后根最后右

后序:先左右后根

例如:

先序:ABCDEFGH

中序:BDCEAFHG

后序:DECBHGFA

#include <iostream>

using namespace std;

struct binarynode
{
    char ch;
    binarynode* lson;
    binarynode* rson;
};

void recurion(binarynode* root) {
    if (root == NULL)
        return;

    cout << root->ch;
    recurion(root->lson);
    recurion(root->rson);
    return;
}

int main()
{

    //创建结点
    binarynode node1 = { 'A',NULL,NULL };
    binarynode node2 = { 'B',NULL,NULL };
    binarynode node3 = { 'C',NULL,NULL };
    binarynode node4 = { 'D',NULL,NULL };
    binarynode node5 = { 'E',NULL,NULL };
    binarynode node6 = { 'F',NULL,NULL };
    binarynode node7 = { 'G',NULL,NULL };
    binarynode node8 = { 'H',NULL,NULL };

    //设置结点关系
    node1.lson = &node2;
    node1.rson = &node6;
    node2.rson = &node3;
    node3.lson = &node4;
    node3.rson = &node5;
    node6.rson = &node7;
    node7.lson = &node8;

    //递归遍历二叉树
    recurion(&node1);
}

2.计算二叉树叶子结点

#include <iostream>

using namespace std;

struct binarynode
{
    char ch;
    binarynode* lson;
    binarynode* rson;
};

void get_leaf_num(binarynode* node,int & num)
{
    if (node == NULL)
        return;

    //只是在遍历基础上加上了对根结点的判断
    if (node->lson == NULL && node->rson == NULL)
        num++;

    get_leaf_num(node->lson,num);
    get_leaf_num(node->rson,num);
    return;
}

int main()
{

    //创建结点
    binarynode node1 = { 'A',NULL,NULL };
    binarynode node2 = { 'B',NULL,NULL };
    binarynode node3 = { 'C',NULL,NULL };
    binarynode node4 = { 'D',NULL,NULL };
    binarynode node5 = { 'E',NULL,NULL };
    binarynode node6 = { 'F',NULL,NULL };
    binarynode node7 = { 'G',NULL,NULL };
    binarynode node8 = { 'H',NULL,NULL };

    //设置结点关系
    node1.lson = &node2;
    node1.rson = &node6;
    node2.rson = &node3;
    node3.lson = &node4;
    node3.rson = &node5;
    node6.rson = &node7;
    node7.lson = &node8;

    int num = 0;
    get_leaf_num(&node1, num);
    cout << "该二叉树的叶子结点数为" << num << endl;
}

3.计算二叉树高度

#include <iostream>

using namespace std;

struct binarynode
{
    char ch;
    binarynode* lson;
    binarynode* rson;
};


// 从树叶一级一级加过来的,小化大,先看一小枝
int  get_tree_depth(binarynode* node)
{
    if (node == NULL)
        return 0;

    int depth = 0;
    int left_depth = get_tree_depth(node->lson);
    int right_depth = get_tree_depth(node->rson);
    
    depth = left_depth > right_depth ? left_depth + 1 : right_depth + 1;

    return depth;
}

int main()
{

    //创建结点
    binarynode node1 = { 'A',NULL,NULL };
    binarynode node2 = { 'B',NULL,NULL };
    binarynode node3 = { 'C',NULL,NULL };
    binarynode node4 = { 'D',NULL,NULL };
    binarynode node5 = { 'E',NULL,NULL };
    binarynode node6 = { 'F',NULL,NULL };
    binarynode node7 = { 'G',NULL,NULL };
    binarynode node8 = { 'H',NULL,NULL };

    //设置结点关系
    node1.lson = &node2;
    node1.rson = &node6;
    node2.rson = &node3;
    node3.lson = &node4;
    node3.rson = &node5;
    node6.rson = &node7;
    node7.lson = &node8;

    int depth = get_tree_depth(&node1);
    cout << "该二叉树的高度为" << depth << endl;
}

4.拷贝二叉树

#include <iostream>

using namespace std;

struct binarynode
{
    char ch;
    binarynode* lson;
    binarynode* rson;
};

binarynode* copy_tree(binarynode* node)
{
    if (node==NULL)
    {
        return NULL;
    }
    binarynode* left_son = copy_tree(node->lson);
    binarynode* right_son = copy_tree(node->rson);
    binarynode* newnode = new binarynode;
    *newnode = { node->ch,left_son,right_son };
    return newnode;
}

void recurion(binarynode* node)
{
    if (node==NULL)
    {
        return;
    }

    cout << node->ch;
    recurion(node->lson);
    recurion(node->rson);
    return;
}


int main()
{

    //创建结点
    binarynode node1 = { 'A',NULL,NULL };
    binarynode node2 = { 'B',NULL,NULL };
    binarynode node3 = { 'C',NULL,NULL };
    binarynode node4 = { 'D',NULL,NULL };
    binarynode node5 = { 'E',NULL,NULL };
    binarynode node6 = { 'F',NULL,NULL };
    binarynode node7 = { 'G',NULL,NULL };
    binarynode node8 = { 'H',NULL,NULL };

    //设置结点关系
    node1.lson = &node2;
    node1.rson = &node6;
    node2.rson = &node3;
    node3.lson = &node4;
    node3.rson = &node5;
    node6.rson = &node7;
    node7.lson = &node8;

    binarynode* copyment = copy_tree(&node1);
    recurion(copyment);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/875126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA基础:抽象类,接口,instanceof,类关系,克隆

1 JDK中的包 JDK JRE 开发工具集&#xff08;javac.exe&#xff09; JRE JVM java类库 JVM java 虚拟机 jdk中自带了许多的包&#xff08;类&#xff09; &#xff0c; 常用的有 java.lang 该包中的类&#xff0c;不需要引用&#xff0c;可以直接使用。 例如&#xff1…

ARM32开发——GD32F4 DMA功能查询

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 DMA0DMA1 DMA0 DMA1

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁&#xff1f; ⛳️推荐…

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系…

深入探索 Ubuntu:从基础到高级应用

本文深入探讨了 Ubuntu 操作系统&#xff0c;涵盖了其起源与发展、安装与配置、软件管理、系统优化、网络配置、安全防护以及在不同领域的应用等多个方面。 在起源与发展部分&#xff0c;介绍了 Ubuntu 于 2004 年创立的背景以及其版本的演进。安装与配置环节详细阐述了系统安…

Linux——分离部署,分化压力

PQS/TPS 每秒请求数/ 每秒事务数 // 流量衡量参数 可以根据预估QPS 和 服务器的支持的最高QPS 对照计算 就可以得出 需要上架的服务器的最小数量 PV 页面浏览数 UV 独立用户访问量 // 对于网站的总体访问量 response time 响应时间 // 每个请求的响应时间…

研1日记9

1.理解conv1d和conv2d a. 1和2处理的数据不同&#xff0c;1维数据和图像 b. 例如x输入形状为(32,19,512)时&#xff0c;卷积公式是针对512的&#xff0c;而19应该变换为参数中指定的输出通道。 2.“SE块”&#xff08;Squeeze-and-Excitation Block&#xff09;它可以帮助模…

JAVA:对称加密技术的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 对称加密是一种加密算法&#xff0c;其中加密和解密使用相同的密钥。其主要特点是速度快、效率高&#xff0c;适用于大数据量的加密需求。对称加密算法通常用于保护数据的机密性和完…

Scratch中秋节游戏——玉兔收集月饼

小虎鲸Scratch资源站-免费Scratch作品源码,素材,教程分享平台! 中秋节将至&#xff0c;想要在这个团圆的日子里增添一点趣味和创意吗&#xff1f;小虎鲸Scratch资源站为大家带来了一款独具特色的中秋节游戏——玉兔收集月饼&#xff01;这款Scratch游戏不仅充满了节日的气氛&am…

小琳AI课堂:MASS模型——革新自然语言处理的预训练技术

大家好&#xff0c;这里是小琳AI课堂。今天我们来聊聊一个在自然语言处理&#xff08;NLP&#xff09;领域非常热门的话题——MASS模型&#xff0c;全称是Masked Sequence to Sequence Pre-training for Language Generation。这是华为诺亚方舟实验室在2019年提出的一种创新模型…

【重学 MySQL】十八、逻辑运算符的使用

【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中&#xff0c;逻辑运算符是构建复杂查询语句的重要工具&#xff0c;它们用于处理布尔类型的数据&#xff0c;进行逻辑判断和组合条件…

MySQL之库和表操作

目录 一&#xff1a;对库的操作 1.创建数据库 2.查看数据库列表 3.显示创建数据库的语句 4.删除数据库 5.字符集与校验集 6.确认当前所处的数据库 7.修改数据库 8.备份和恢复 9.查看连接情况 二:对表的操作 1.创建表 2.查看表 3.删除表 4.修改表 接下来的日…

终端文件管理神器 !!!【送源码】

项目简介 nnn是一款专为命令行爱好者打造的高效终端文件管理器。它以其超小的体积、几乎零配置的要求以及卓越的速度表现而著称。nnn不仅适用于Linux、macOS、BSD等操作系统&#xff0c;还能够在诸如树莓派、Android上的Termux、WSL、Cygwin等多个平台运行。它遵循POSIX标准&am…

Linux——解压大型zip文件报错:bad zipfile offset (local header sig) 的解决方法

一、现象描述 完整一行报错信息&#xff1a; error: invalid compressed data to inflate file #14: bad zipfile offset (local header sig) 二、解决办法 利用 -F 去修复&#xff1a; zip -F xxx.zip --out large.zip得到&#xff1a; 解压&#xff1a; unzip large.zi…

Python爱心射线(完整代码)

目录 系列目录 写在前面​ 完整代码 下载代码 代码分析 写在后面 系列目录 序号直达链接表白系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3

代码随想录训练营Day2 | 209.长度最小的子数组 | 59.螺旋矩阵II | 58. 区间和

1. 学习滑动窗口 2.学习标准输入输出模式 3.学习文档代码随想录 (programmercarl.com) 数组总结 Leetcode 209.长度最小的子数组 题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组…

Unity Addressables 使用说明(二)管理 Addressables

组织和管理 Addressables 的主要方式是使用组&#xff08;groups&#xff09;和配置文件&#xff08;profiles&#xff09;。本节概述了如何使用这些工具来有效地管理 Addressables。 【概述】管理 Addressables 在决定如何管理项目中的资源之前&#xff0c;先熟悉资源如何创…

CCF推荐A类会议和期刊总结(计算机网络领域)- 2022

CCF推荐A类会议和期刊总结&#xff08;计算机网络领域&#xff09;- 2022 在中国计算机学会&#xff08;CCF&#xff09;的推荐体系中&#xff0c;A类会议和期刊代表着计算机网络领域的顶尖水平。这些会议和期刊不仅汇集了全球顶尖的研究成果&#xff0c;还引领着该领域的前沿发…

Python操作ES集群API(增删改查等)

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 学习B站博主教程笔记&#xff1a; 最新版适合自学的ElasticStack全套视频&#xff08;Elk零基础入门到精通教程&#xff09;Linux运维必备—Elastic…

【信号】信号的保存

信号的保存 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.注意,阻塞和…