当前位置: 首页 > news >正文

数据结构6 · BinaryTree二叉树模板

代码函数功能顺序如下:

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;
}

相关文章:

  • 【51单片机8位数码管动态显示、右向左流水显示】2022-4-16
  • OpenHarmony - 驱动使用指南,HDF驱动开发流程
  • C++11新特性_标准库_std::array
  • 51c嵌入式~电路~合集4
  • 《AI大模型应知应会100篇》第44篇:大模型API调用最佳实践(附完整代码模板)
  • 计算机基础:二进制基础16,八进制加法
  • 虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置
  • 关于CSDN创作的常用模板内容
  • 从括号匹配看栈:数据结构入门的实战与原理
  • CSS 架构与命名规范
  • HTTPS协议:更安全的HTTP
  • 基于深度学习的毒蘑菇检测
  • [android]MT6835 Android 关闭selinux方法
  • Cesium 环境搭建
  • STM32复盘总结——芯片简介
  • 工作记录 2017-12-12 + 在IIS下发布wordpress
  • 第二十周:项目开发中遇到的相关问题(一)
  • 【数据结构】堆的完整实现
  • 51单片机驱动 矩阵键盘
  • GESP2024年6月认证C++八级( 第三部分编程题(1)最远点对)
  • 9米长林肯车开进安徽“皖南川藏线”致拥堵数小时,车主回应争议称配合调查
  • 净海护渔,中国海警局直属第一局开展伏季休渔普法宣传活动
  • 中国代表:美“对等关税”和歧视性补贴政策严重破坏世贸规则
  • 李开复出任福耀科技大学理事会理事,助力学校AI战略
  • 铁路上海站今日预计发送旅客65.8万人次,同比增长超16%
  • 广东省副省长刘红兵跨省调任湖南省委常委、宣传部长