C++数据结构X篇_16_二叉树的拷贝和释放(采用递归的方法)

在上篇的基础上,本篇介绍如何进行二叉树的拷贝和释放。从代码中可以看到采用递归方式进行的拷贝、释放操作,基本套路都是一样的

文章目录

  • 1. 二叉树的拷贝
  • 2. 二叉树的释放

1. 二叉树的拷贝

#include <iostream>
using namespace std;//定义二叉树节点
class binarynode
{
public:char data;			 //节点数据域binarynode* lchild;  //左孩子binarynode* rchild;  //右孩子
};//先序遍历二叉树,对原二叉树和拷贝二叉树进行打印
void Recursion(binarynode* root)
{if (root == nullptr){return;}cout << root->data << endl;//遍历左子树Recursion(root->lchild);//遍历右子树Recursion(root->rchild);
}//拷贝二叉树
binarynode* CopyBinaryTree(binarynode* root)
{if (root == nullptr){return NULL;}//拷贝左子树binarynode* lchild = CopyBinaryTree(root->lchild);//拷贝右子树binarynode* rchild = CopyBinaryTree(root->rchild);//创建节点binarynode* newnode = new binarynode;newnode->data = root->data;newnode->lchild = lchild;newnode->rchild = rchild;return newnode;
}//创建二叉树
void createtree()
{//创建节点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.lchild = &node2;node1.rchild = &node6;node2.rchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;binarynode* root = CopyBinaryTree(&node1);Recursion(root);}int main()
{createtree();system("pause");return 0;
}

运行结果:
在这里插入图片描述

2. 二叉树的释放

#include <iostream>
using namespace std;//定义二叉树节点
class binarynode
{
public:char data;			 //节点数据域binarynode* lchild;  //左孩子binarynode* rchild;  //右孩子
};//遍历二叉树,对原二叉树和拷贝二叉树进行打印
void Recursion(binarynode* root)
{if (root == nullptr){return;}cout << root->data << endl;//遍历左子树Recursion(root->lchild);//遍历右子树Recursion(root->rchild);
}//拷贝二叉树
binarynode* CopyBinaryTree(binarynode* root)
{if (root == nullptr){return NULL;}//拷贝左子树binarynode* lchild = CopyBinaryTree(root->lchild);//拷贝右子树binarynode* rchild = CopyBinaryTree(root->rchild);//创建节点binarynode* newnode = new binarynode;newnode->data = root->data;newnode->lchild = lchild;newnode->rchild = rchild;return newnode;
}//释放二叉树内存,进行递归释放
void FreeSpaceBinaryTree(binarynode* root)
{if (root == nullptr){return;}//释放左子树FreeSpaceBinaryTree(root->lchild);//释放右子树FreeSpaceBinaryTree(root->rchild);//释放当前节点delete root;
}//创建二叉树
void createtree()
{//创建节点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.lchild = &node2;node1.rchild = &node6;node2.rchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;binarynode* root = CopyBinaryTree(&node1);Recursion(root);FreeSpaceBinaryTree(root);}int main()
{createtree();system("pause");return 0;
}

运行结果:
在这里插入图片描述

  1. 二叉树的拷贝和释放

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTOS(4)自己的第一个FreeRTOS程序

创建两个任务 什么是任务呢&#xff1f; 对于整个单片机程序&#xff0c;我们称之为application&#xff0c;应用程序。 使用FreeRTOS时&#xff0c;我们可以在application中创建多个任务(task)&#xff0c;有些文档把任务也称为线程 (thread)。 void Task1Function(void *p…

Druid连接池最小连接数设置失效问题

问题发现&#xff1a; 配置 当项目启动后 线程池确实是初始化了5条连接&#xff0c;但是当项目运行一段时间后&#xff0c;5条连接确消失了&#xff0c;只会程序用到得时候&#xff0c;再去初始化连接&#xff0c;这样有点违背了参数设置得意义&#xff0c;后来通过查阅资料发…

如何通过Photoshop将视频转换成GIF图片

一、应用场景 1、将视频转有趣动图发朋友圈 2、写CSDN无法上传视频&#xff0c;而可以用GIF动图替代 3、其他 二、实现步骤 1、打开Photoshop APP 2、点击文件——导入——视频帧到图层 3、选择视频文件 4、配置视频信息&#xff0c;按照图片提示配置完毕之后点击确定&…

C++对象模型(13)-- 构造函数语义学:析构函数

1、默认析构函数生成规则 跟构造函数一样&#xff0c;编译器不一定会为类生成默认析构函数。生成默认析构函数的规则有下面2条&#xff1a; &#xff08;1&#xff09;包含一个类类型的成员变量&#xff0c;且成员变量所属的类有默认析构函数。 &#xff08;2&#xff09;其…

14. Java多线程基础

Java —— 多线程 1. 线程与进程1.1 线程生命周期1.2 线程优先级 2. 多线程2.1 守护线程2.2 多线程高并发2.3 synchronized同步锁2.4 synchronized互斥锁 1. 线程与进程 进程&#xff08;Process&#xff09; 操作系统进行资源分配和调度的基本单位&#xff1a;系统中正在运行的…

【网络协议】聊聊从物理层到MAC层 ARP 交换机

物理层 物理层其实就是电脑、交换器、路由器、光纤等。组成一个局域网的方式可以使用集线器。可以将多台电脑连接起来&#xff0c;然后进行将数据转发给别的端口。 数据链路层 Hub其实就是广播模式&#xff0c;如果A电脑发出一个包&#xff0c;B、C电脑也可以收到。那么数据…

[uni-app] canvas绘制圆环进度条

文章目录 需求参考链接基本问题的处理1:画布旋转的问题2:注意arc()的起始位置是3点钟方向3: 如果绘制1.9*Matn.PI的圆环, 要保证其实位置在0点方向?4:小线段怎么画, 角度怎么处理? 源码 需求 要绘制一个如此的进度条 参考链接 uni-app使用canvas绘制时间刻度以及不显示问…

4.Vue-Vue调用第三方接口

题记 用vue调用第三方接口&#xff0c;以下是全部代码和操作流程。 寻找第三方接口网站 推荐&#xff1a;免费API - 提供免费接口调用平台 (aa1.cn) 下面的代码以下图中的接口为例 安装axios模块 在终端输入以下命令&#xff1a; npm install axios 调用第三方接口代码 调…

从入门到进阶 之 ElasticSearch 节点配置 集群篇

&#x1f339; 以上分享 ElasticSearch 安装部署&#xff0c;如有问题请指教写。&#x1f339;&#x1f339; 如你对技术也感兴趣&#xff0c;欢迎交流。&#x1f339;&#x1f339;&#x1f339; 如有需要&#xff0c;请&#x1f44d;点赞&#x1f496;收藏&#x1f431;‍&a…

Spring框架(三)

1、代理模式&#xff1a; 二十三种设计模式中的一种&#xff0c;属于结构型模式。它的作用就是通过提供一个代理类&#xff0c;让我们在调用目标方法的时候&#xff0c;不再是直接对目标方法进行调用&#xff0c;而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标…

如何让大模型自由使用外部知识与工具

本文将分享为什么以及如何使用外部的知识和工具来增强视觉或者语言模型。 全文目录&#xff1a; 1. 背景介绍 OREO-LM: 用知识图谱推理来增强语言模型 REVEAL: 用多个知识库检索来预训练视觉语言模型 AVIS: 让大模型用动态树决策来调用工具 技术交流群 建了技术交流群&a…

【灵动 Mini-G0001开发板】+Keil5开发环境搭建+ST-Link/V2程序下载和仿真+4颗LED100ms闪烁。

我们拿到手里的是【灵动 Mini-G0001开发板】 如下图 我们去官网下载开发板对应资料MM32G0001官网 我们需要下载Mini—G0001开发板的库函数与例程&#xff08;第一手学习资料&#xff09;Keil支持包&#xff0c; PCB文件有需要的&#xff0c;可以自行下载。用户指南需要下载&a…