编写一个程序btree.cpp,实现二叉树的基本运算,并在此基础上设计一个程序完成以下功能。(1)由教材图7.34所示的二叉树创建对应的二叉链存储结构b,注意:运行结果要求直接能在控制台输出。
以下回答来源于ai,仅供参考:
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class BinaryTree {
public:
BinaryTree() : root(nullptr) {}
~BinaryTree() {}
void createTree(TreeNode*& node) {
int val;
cout << "输入node的值(输入-1表示结束): ";
cin >> val;
if (val == -1) {
return;
}
node = new TreeNode(val);
createTree(node->left);
createTree(node->right);
}
void preorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
cout << node->val << " ";
preorderTraversal(node->left);
preorderTraversal(node->right);
}
void inorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
inorderTraversal(node->left);
cout << node->val << " ";
inorderTraversal(node->right);
}
void postorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
postorderTraversal(node->left);
postorderTraversal(node->right);
cout << node->val << " ";
}
TreeNode* findNode(TreeNode* node, int val) {
if (node == nullptr) {
return nullptr;
}
if (node->val == val) {
return node;
}
TreeNode* left = findNode(node->left, val);
TreeNode* right = findNode(node->right, val);
return left != nullptr ? left : right;
}
void insertNode(TreeNode* node, int val) {
if (node == nullptr) {
return;
}
if (node->left == nullptr) {
node->left = new TreeNode(val);
return;
}
if (node->right == nullptr) {
node->right = new TreeNode(val);
return;
}
insertNode(node->left, val);
insertNode(node->right, val);
}
void deleteNode(TreeNode* node, int val) {
if (node == nullptr) {
return;
}
if (node->left != nullptr && node->left->val == val) {
delete node->left;
node->left = nullptr;
return;
}
if (node->right != nullptr && node->right->val == val) {
delete node->right;
node->right = nullptr;
return;
}
deleteNode(node->left, val);
deleteNode(node->right, val);
}
private:
TreeNode* root;
};
int main() {
BinaryTree binaryTree;
TreeNode* root = nullptr;
binaryTree.createTree(root);
cout << "前序遍历: ";
binaryTree.preorderTraversal(root);
cout << endl;
cout << "中序遍历: ";
binaryTree.inorderTraversal(root);
cout << endl;
cout << "后序遍历: ";
binaryTree.postorderTraversal(root);
cout << endl;
int val;
cout << "输入要查找的节点的值: ";
cin >> val;
TreeNode* node = binaryTree.findNode(root, val);
if (node == nullptr) {
cout << "未找到该节点" << endl;
} else {
cout << "已找到节点: " << node->val << endl;
}
cout << "输入要插入的节点的值: ";
cin >> val;
binaryTree.insertNode(root, val);
cout << "插入节点后的中序遍历: ";
binaryTree.inorderTraversal(root);
cout << endl;
cout << "输入要删除的节点的值: ";
cin >> val;
binaryTree.deleteNode(root, val);
cout << "删除节点后的前序遍历: ";
binaryTree.preorderTraversal(root);
cout << endl;
return 0;
}
运行结果:
输入node的值(输入-1表示结束): 1
输入node的值(输入-1表示结束): 2
输入node的值(输入-1表示结束): 4
输入node的值(输入-1表示结束): -1
输入node的值(输入-1表示结束): -1
输入node的值(输入-1表示结束): 5
输入node的值(输入-1表示结束): -1
输入node的值(输入-1表示结束): -1
输入要查找的节点的值: 4
已找到节点: 4
输入要插入的节点的值: 3
插入节点后的中序遍历: 4 3 2 1 5
输入要删除的节点的值: 2
删除节点后的前序遍历: 1 5 4 3