代码函数功能顺序如下:

1:destroy:递归删除树

2:copy:复制二叉树

3:preOrder:递归前序遍历

4:inOrder:递归中序遍历

5:postOrder:递归后续遍历

6:levelOrder:BFS层序遍历

7:mergeTrees:合并树

8:getRoot:获取根节点

#include <bits/stdc++.h>
using namespace std;
struct TreeNode
{int val;		 // 节点值TreeNode *left;	 // 左子树TreeNode *right; // 右子树TreeNode(int x)	 // 构造函数{val = x;left = nullptr;right = nullptr;}
};
// class定义类
class BinaryTree
{
private:TreeNode *root; // 定义根节点,根节点是私有的,外部不能直接访问// 递归删除树void destroy(TreeNode *node) // 参数是正在处理的二叉树结点{if (node) // 在节点存在(不为空)的情况下{destroy(node->left);  // 递归删除左子树destroy(node->right); // 递归删除右子树delete node;		  // 删除当前节点}}// 递归复制二叉树TreeNode *copy(TreeNode *node) // 输入原二叉树的某个结点指针// 返回复制后的新二叉树对应节点指针{if (!node){return nullptr;}TreeNode *newNode = new TreeNode(node->val);newNode->left = copy(node->left);newNode->right = copy(node->right);return newNode;}public:BinaryTree() : root(nullptr) {}// 构造函数,初始化根节点为空// 递归前序遍历void preOrder(TreeNode *node = nullptr){if (!node) // 如果当前是空节点,则返回{// 如果当前节点为空,停止递归if (!root){return;}node = root; // 如果当前节点不为空,则将当前节点设为根节点}cout << node->val << " "; // 输出当前节点值if (node->left){preOrder(node->left); // 递归遍历左子树}if (node->right){preOrder(node->right); // 递归遍历右子树}}// 递归中序遍历void inOrder(TreeNode *node = nullptr){if (!node){if (!root){return;}node = root;}if (node->left){inOrder(node->left);}cout << node->val << " ";if (node->right){inOrder(node->right);}}// 递归后序遍历void postOrder(TreeNode *node = nullptr){if (!node){if (!root){return;}node = root;}if (node->left){postOrder(node->left);}if (node->right){postOrder(node->right);}cout << node->val << " ";}// 层序遍历(BFS)void levelOrder(const vector<int> &nodes) // 参数用来存储二叉树的层序遍历序列{if (nodes.empty() || nodes[0] == -1){root = nullptr;return;}root = new TreeNode(nodes[0]);// 根节点是第一个元素queue<TreeNode *> q;// 使用队列进行层序遍历q.push(root);// 放入第一个元素int i = 1;while (!q.empty() && i < nodes.size()){TreeNode *current = q.front();// 获取当前节点,起名为currentq.pop(); // 弹出队头if (i < nodes.size() && nodes[i] != -1){ // 如果当前节点有左子树current->left = new TreeNode(nodes[i]);// 创建左子树,值为nodes[i]q.push(current->left);// 将左子树放入队列}i++; // i指向下一个元素// 右子树同理if (i < nodes.size() && nodes[i] != -1){current->right = new TreeNode(nodes[i]);q.push(current->right);}i++;}}// 合并两棵树// void,直接修改当前数的值,把他与other合并// other树会清空(root指针被设为nullptr)void mergeTrees(BinaryTree &other, int mergeValue){// 参数other是另一个二叉树,mergeValue是合并后的新根节点的值if (!root){root = other.root;	  // 如果当前树为空,直接将other树赋值给当前树other.root = nullptr; // other树清空return;}TreeNode *newRoot = new TreeNode(mergeValue);// 创建新根节点,值为mergeValue,作为合并后的根节点newRoot->left = root;// 新根节点的左子树为当前树的根节点newRoot->right = other.root;// 新根节点的右子树为other树的根节点root = newRoot;// 将新根节点赋值给当前树的根节点other.root = nullptr;//	other树清空}// 析构函数~BinaryTree() { destroy(root); } // 析构函数,删除树// 获取根节点TreeNode *getRoot() { return root; } // 获取根节点
};
int main()
{// 测试1: 构造空树BinaryTree emptyTree;cout << "Empty tree pre-order: ";emptyTree.preOrder(); // 应无输出cout << endl;// 测试2: 从层序遍历数组构造二叉树vector<int> nodes1 = {1, 2, 3, -1, 4, 5, 6}; // -1表示空节点BinaryTree tree1;tree1.levelOrder(nodes1); // 构建树cout << "Tree1 Pre-order(recursive): ";tree1.preOrder();cout << endl;cout << "Tree1 In-order(recursive): ";tree1.inOrder();cout << endl;cout << "Tree1 Post-order(recursive): ";tree1.postOrder();cout << endl;// 测试3: 复制构造函数BinaryTree tree2;tree2.levelOrder({10, 11, 12, 13, -1, 14}); // 构建另一棵树cout << "\nTree2 Level-order built: 10,11,12,13,-1,14" << endl;cout << "Tree2 Pre-order: ";tree2.preOrder();cout << endl;// 测试4: 合并两棵树cout << "\nMerging Tree1 and Tree2 with new root value 100..." << endl;tree1.mergeTrees(tree2, 100);cout << "Merged Tree Pre-order: ";tree1.preOrder(); // 应显示: 100 1 2 4 3 5 6 10 11 13 12 14cout << endl;// 测试5: 检查tree2是否被清空cout << "\nTree2 after merging (should be empty): ";tree2.preOrder(); // 应无输出cout << endl;// 测试6: 析构函数(自动调用,无需显式测试)cout << "\nAll trees will be automatically destroyed when exiting main()" << endl;return 0;
}

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

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

相关文章

C++/SDL进阶游戏开发 —— 双人塔防游戏(代号:村庄保卫战 13)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 十…

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…

AE/PR模板 100个现代文字标题动态排版效果动画 Motion Titles

Motion Titles是一个令人惊艳的AE/PR模板&#xff0c;提供了100个现代文字标题的动态排版效果动画。这些动画效果能够为你的项目增添视觉冲击力和专业感&#xff0c;为文字标题注入活力和动感。该模板适用于Adobe After Effects CC或更高版本以及Adobe Premiere Pro 2020或更高…

【AI提示词】二八法则专家

提示说明 精通二八法则&#xff08;帕累托法则&#xff09;的广泛应用&#xff0c;擅长将其应用于商业、管理、个人发展等领域&#xff0c;深入理解其在不同场景中的具体表现和实际意义。 提示词 # Role: 二八法则专家## Profile - language: 中文 - description: 精通二八法…

前端八股 CSS 1

盒子模型 进行布局时将所有元素表示为一个个盒子box padding margin border content content&#xff1a;盒子内容 待显示的文本和图像 padding&#xff1a;内边距&#xff0c;内容和border之间的空间&#xff0c;不能为负数&#xff0c;受bkc影响 border:边框&#xff0c…

组件通信-$attrs

概述&#xff1a;$attrs用于实现当前组件的父组件&#xff0c;向当前组件的子组件通信&#xff08;爷→孙&#xff09;。 具体说明&#xff1a;$attrs是一个对象&#xff0c;包含所有父组件传入的标签属性。 注意&#xff1a;$attrs会自动排除props中声明的属性(可以认为声明过…

jdk开启https详细步骤

要在 JDK 中启用 HTTPS&#xff0c;您可以按照以下详细步骤进行操作&#xff1a; 生成密钥库和证书&#xff1a; 首先&#xff0c;您需要生成一个密钥库&#xff08;keystore&#xff09;和证书&#xff0c;可以使用 keytool 工具来生成。以下是使用 keytool 生成密钥库和证书的…

文章四《深度学习核心概念与框架入门》

文章4&#xff1a;深度学习核心概念与框架入门——从大脑神经元到手写数字识别的奇幻之旅 引言&#xff1a;给大脑装个"GPU加速器"&#xff1f; 想象一下&#xff0c;你的大脑如果能像智能手机的GPU一样快速处理信息会怎样&#xff1f;这正是深度学习的终极目标&…

关于CSDN创作的常用模板内容

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 好文评论新文推送 &#x1f4c3;文章前言 &…

linux的信号量初识

Linux下的信号量(Semaphore)深度解析 在多线程或多进程并发编程的领域中&#xff0c;确保对共享资源的安全访问和协调不同执行单元的同步至关重要。信号量&#xff08;Semaphore&#xff09;作为经典的同步原语之一&#xff0c;在 Linux 系统中扮演着核心角色。本文将深入探讨…

《Android 应用开发基础教程》——第十一章:Android 中的图片加载与缓存(Glide 使用详解)

目录 第十一章&#xff1a;Android 中的图片加载与缓存&#xff08;Glide 使用详解&#xff09; &#x1f539; 11.1 Glide 简介 &#x1f538; 11.2 添加 Glide 依赖 &#x1f538; 11.3 基本用法 ✦ 加载网络图片到 ImageView&#xff1a; ✦ 加载本地资源 / 文件 / UR…

AE模板 300个故障干扰损坏字幕条标题动画视频转场预设

这个AE模板提供了300个故障干扰损坏字幕条标题动画视频转场预设&#xff0c;让您的视频具有炫酷的故障效果。无论是预告片、宣传片还是其他类型的视频&#xff0c;这个模板都能带给您令人惊叹的故障运动标题效果。该模板无需任何外置插件或脚本&#xff0c;只需一键点击即可应用…

在 Python 中,以双下划线开头和结尾的函数(如 `__str__`、`__sub__` 等)

在 Python 中&#xff0c;以双下划线开头和结尾的函数&#xff08;如 __str__、__sub__ 等&#xff09;被称为特殊方法&#xff08;Special Methods&#xff09;或魔术方法&#xff08;Magic Methods&#xff09;。它们确实是 Python 内置的&#xff0c;用于定义类的行为&#…

git问题记录-如何切换历史提交分支,且保留本地修改

问题记录 我在本地编写了代码&#xff0c;突然想查看之前提交的代码&#xff0c;并且想保留当前所在分支所做的修改 通过git stash对本地的代码进行暂存 使用git checkout <commit-hash>切换到之前的提交记录。 查看完之后我想切换回来&#xff0c;恢复暂存的本地代码…

Github开通第三方平台OAuth登录及Java对接步骤

调研起因&#xff1a; 准备搞AI Agent海外项目&#xff0c;有相当一部分用户群体是程序员&#xff0c;所以当然要接入Github这个全球最大的同性交友网站了&#xff0c;让用户使用Github账号一键完成注册或登录。 本教程基于Web H5界面进行对接&#xff0c;同时也提供了spring-…

期刊、出版社、索引数据库

image 1、研究人员向期刊或者会议投稿&#xff0c;交注册费和相应的审稿费等相关费用[1]&#xff1b; 2、会议组织者和期刊联系出版社&#xff0c;交出版费用&#xff1b; 3、出版社将论文更新到自己的数据库中&#xff0c;然后将数据库卖给全世界各大高校或企业&#xff1b; 4…

Transformer 模型及深度学习技术应用

近年来&#xff0c;随着卷积神经网络&#xff08;CNN&#xff09;等深度学习技术的飞速发展&#xff0c;人工智能迎来了第三次发展浪潮&#xff0c;AI技术在各行各业中的应用日益广泛。 注意力机制&#xff1a;理解其在现代深度学习中的关键作用&#xff1b; Transformer模型…

zynq7035的arm一秒钟最多可以支持触发多少次中断

一、概述 1.关于zynq7035的ARM处理器一秒能够支持多少次中断触发&#xff0c;需要综合来考虑。需要确定ARM处理器的参数&#xff0c;目前zynq7000系列&#xff0c;使用的双核Cortex-A9处理器。其中主频大概在500MHZ~1GHZ左右&#xff0c;不同的用户配置的主频可能稍微有差别。 …

数据结构与算法:图论——最短路径

最短路径 先给出一些leetcode算法题&#xff0c;以后遇见了相关题目再往上增加 最短路径的4个常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同应用场景下&#xff0c;应有选择地使用它们&#xff1a; 图的规模小&#xff0c;用Floyd。若边的权值有负数&#xff0c;需要…

[android]MT6835 Android 关闭selinux方法

Selinux SELinux is an optional feature of the Linux kernel that provides support to enforce access control security policies to enforce MAC. It is based on the LSM framework. Working with SELinux on Android – LineageOS Android 关闭selinux MT6835 Android…