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

代码函数功能顺序如下:

1:destroy:递归删除树

2:copy:复制二叉树

3:preOrder:递归前序遍历

4:inOrder:递归中序遍历

5:postOrder:递归后续遍历

6:levelOrder:BFS层序遍历

7:mergeTrees:合并树

8:getRoot:获取根节点

cpp 复制代码
#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();
			// 获取当前节点,起名为current
			q.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 14
	cout << 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;
}
相关推荐
2601_962218614 小时前
万象生鲜系统业财一体化底层打通技术自动生成经营账单
大数据·数据库·人工智能·python·算法
anew___4 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
吞下星星的少年·-·4 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
stolentime5 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt6 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++
和裕6 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技6 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi
Msshu1237 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
shirsl8 小时前
算法 Day 2 滑动窗口 + 栈 / 单调栈
开发语言·python·算法
土司大王9 小时前
LeetCode hot100 回溯专题总结:Java 通用模板、决策树模型
java·算法·leetcode·决策树