用c++完成以下操作1.以二叉链表表示二叉树,建立一棵二叉树。 2.输出二叉树的中序遍历结果。 3.输出二叉树的前序遍历结果。 4.输出二叉树的后序遍历结果。 5.计算二叉树的深度。 6.统计二叉树的结点个数 。 7.统计二叉树的叶结点个数。 8.统计二叉树的度为1的结点个数。 9.输出二叉树中从每个叶子结点到根结点的路径。
时间: 2023-06-16 22:03:27 浏览: 109
c++实现二叉树的一些基本操作
4星 · 用户满意度95%
以下是 C++ 实现的代码:
```C++
#include <iostream>
#include <vector>
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;
public:
BinaryTree() : root(nullptr) {}
~BinaryTree() {}
// 建立二叉树
void buildTree() {
int val;
cout << "请输入二叉树的节点值,-1表示空节点:" << endl;
cin >> val;
if (val == -1) {
root = nullptr;
} else {
root = new TreeNode(val);
buildTree(root->left);
buildTree(root->right);
}
}
void buildTree(TreeNode*& node) {
int val;
cin >> val;
if (val == -1) {
node = nullptr;
} else {
node = new TreeNode(val);
buildTree(node->left);
buildTree(node->right);
}
}
// 中序遍历
void inorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
inorderTraversal(node->left);
cout << node->val << " ";
inorderTraversal(node->right);
}
// 前序遍历
void preorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
cout << node->val << " ";
preorderTraversal(node->left);
preorderTraversal(node->right);
}
// 后序遍历
void postorderTraversal(TreeNode* node) {
if (node == nullptr) {
return;
}
postorderTraversal(node->left);
postorderTraversal(node->right);
cout << node->val << " ";
}
// 计算二叉树的深度
int maxDepth(TreeNode* node) {
if (node == nullptr) {
return 0;
}
int leftDepth = maxDepth(node->left);
int rightDepth = maxDepth(node->right);
return max(leftDepth, rightDepth) + 1;
}
// 统计二叉树的结点个数
int countNodes(TreeNode* node) {
if (node == nullptr) {
return 0;
}
return countNodes(node->left) + countNodes(node->right) + 1;
}
// 统计二叉树的叶结点个数
int countLeaves(TreeNode* node) {
if (node == nullptr) {
return 0;
}
if (node->left == nullptr && node->right == nullptr) {
return 1;
}
return countLeaves(node->left) + countLeaves(node->right);
}
// 统计二叉树的度为1的结点个数
int countNodesDegree1(TreeNode* node) {
if (node == nullptr) {
return 0;
}
int count = 0;
if (node->left != nullptr) {
count++;
}
if (node->right != nullptr) {
count++;
}
return countNodesDegree1(node->left) + countNodesDegree1(node->right) + (count == 1 ? 1 : 0);
}
// 输出二叉树中从每个叶子结点到根结点的路径
void printPath(TreeNode* node, vector<int>& path) {
if (node == nullptr) {
return;
}
path.push_back(node->val);
if (node->left == nullptr && node->right == nullptr) {
for (int i = path.size() - 1; i >= 0; i--) {
cout << path[i] << " ";
}
cout << endl;
} else {
printPath(node->left, path);
printPath(node->right, path);
}
path.pop_back();
}
void printPaths(TreeNode* node) {
vector<int> path;
printPath(node, path);
}
};
int main() {
BinaryTree tree;
tree.buildTree();
cout << "二叉树的中序遍历结果:" << endl;
tree.inorderTraversal(tree.getRoot());
cout << endl;
cout << "二叉树的前序遍历结果:" << endl;
tree.preorderTraversal(tree.getRoot());
cout << endl;
cout << "二叉树的后序遍历结果:" << endl;
tree.postorderTraversal(tree.getRoot());
cout << endl;
cout << "二叉树的深度为:" << tree.maxDepth(tree.getRoot()) << endl;
cout << "二叉树的结点个数为:" << tree.countNodes(tree.getRoot()) << endl;
cout << "二叉树的叶结点个数为:" << tree.countLeaves(tree.getRoot()) << endl;
cout << "二叉树的度为1的结点个数为:" << tree.countNodesDegree1(tree.getRoot()) << endl;
cout << "二叉树中从每个叶子结点到根结点的路径为:" << endl;
tree.printPaths(tree.getRoot());
return 0;
}
```
阅读全文