二叉树的递归是指使用递归方法解决与二叉树相关的问题。二叉树的递归通常涉及到遍历、搜索、插入、删除等操作。
#include <iostream>
#include <queue>
#include <climits>using namespace std;// 二叉树节点定义
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};// 二叉树类定义
class BinaryTree {
private:TreeNode* root;// 辅助函数:插入节点TreeNode* insertNode(TreeNode* node, int val) {if (!node) return new TreeNode(val);if (val < node->val) {node->left = insertNode(node->left, val);} else {node->right = insertNode(node->right, val);}return node;}// 辅助函数:删除节点TreeNode* deleteNode(TreeNode* node, int key) {if (!node) return nullptr;if (key < node->val) {node->left = deleteNode(node->left, key);} else if (key > node->val) {node->right = deleteNode(node->right, key);} else {if (!node->left) return node->right;if (!node->right) return node->left;TreeNode* temp = findMin(node->right);node->val = temp->val;node->right = deleteNode(node->right, temp->val);}return node;}// 辅助函数:查找最小节点TreeNode* findMin(TreeNode* node) {while (node->left) node = node->left;return node;}// 辅助函数:销毁二叉树void destroyTree(TreeNode* node) {if (!node) return;destroyTree(node->left);destroyTree(node->right);delete node;}public:// 构造函数BinaryTree() : root(nullptr) {}// 析构函数~BinaryTree() {destroyTree(root);}// 插入节点void insert(int val) {root = insertNode(root, val);}// 删除节点void remove(int key) {root = deleteNode(root, key);}// 前序遍历void preorderTraversal() {preorderTraversal(root);}// 中序遍历void inorderTraversal() {inorderTraversal(root);}// 后序遍历void postorderTraversal() {postorderTraversal(root);}// 层序遍历void levelOrderTraversal() {if (!root) return;queue<TreeNode*> q;q.push(root);while (!q.empty()) {TreeNode* node = q.front();q.pop();cout << node->val << " ";if (node->left) q.push(node->left);if (node->right) q.push(node->right);}}// 搜索节点bool search(int val) {TreeNode* current = root;while (current) {if (current->val == val) return true;if (val < current->val) current = current->left;else current = current->right;}return false;}private:// 前序遍历辅助函数void preorderTraversal(TreeNode* node) {if (node) {cout << node->val << " ";preorderTraversal(node->left);preorderTraversal(node->right);}}// 中序遍历辅助函数void inorderTraversal(TreeNode* node) {if (node) {inorderTraversal(node->left);cout << node->val << " ";inorderTraversal(node->right);}}// 后序遍历辅助函数void postorderTraversal(TreeNode* node) {if (node) {postorderTraversal(node->left);postorderTraversal(node->right);cout << node->val << " ";}}
};int main() {BinaryTree tree;// 插入节点tree.insert(10);tree.insert(5);tree.insert(15);tree.insert(3);tree.insert(7);tree.insert(12);tree.insert(17);
/*10/ \5 15/ \ / \3 7 12 17*/// 输出各种遍历结果cout << "Preorder Traversal: ";tree.preorderTraversal();cout << endl;cout << "Inorder Traversal: ";tree.inorderTraversal();cout << endl;cout << "Postorder Traversal: ";tree.postorderTraversal();cout << endl;cout << "Level Order Traversal: ";tree.levelOrderTraversal();cout << endl;// 搜索节点cout << "Searching for value 12: ";if (tree.search(12)) cout << "Found!" << endl;else cout << "Not Found!" << endl;// 删除节点tree.remove(5);// 输出删除后的中序遍历结果cout << "Inorder Traversal after deleting node with value 5: ";tree.inorderTraversal();cout << endl;return 0;
}
Preorder Traversal: 10 5 3 7 15 12 17
Inorder Traversal: 3 5 7 10 12 15 17
Postorder Traversal: 3 7 5 12 17 15 10
Level Order Traversal: 10 5 15 3 7 12 17
Searching for value 12: Found!
Inorder Traversal after deleting node with value 5: 3 7 10 12 15 17
请按任意键继续. . .