数据结构题,实现途中要求的功能并打印出其二叉树
创建建立二叉树并打印出,然后统计计算叶子结点数,交换左右节点,几点二叉树的最大宽度,
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 建立二叉树
TreeNode* buildBinaryTree() {
std::cout << "请输入二叉树的元素(-1表示空节点):" << std::endl;
int val;
std::cin >> val;
if (val == -1) {
return nullptr;
}
TreeNode* root = new TreeNode(val);
root->left = buildBinaryTree();
root->right = buildBinaryTree();
return root;
}
// 统计二叉树的叶子节点个数
int countLeafNodes(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return 1;
}
return countLeafNodes(root->left) + countLeafNodes(root->right);
}
// 交换二叉树的每个节点的左孩子与右孩子
void swapChildren(TreeNode* root) {
if (root == nullptr) {
return;
}
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
swapChildren(root->left);
swapChildren(root->right);
}
// 计算二叉树的最大宽度
int maxWidth(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int maxW = 0;
std::queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int levelSize = q.size();
maxW = std::max(maxW, levelSize);
for (int i = 0; i < levelSize; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
return maxW;
}
// 求任意二叉树中第一条最长路径,并输出此路径
std::vector<int> longestPath(TreeNode* root) {
std::vector<int> path;
std::vector<int> longest;
findLongestPath(root, path, longest);
return longest;
}
void findLongestPath(TreeNode* root, std::vector<int>& path, std::vector<int>& longest) {
if (root == nullptr) {
return;
}
path.push_back(root->val);
if (root->left == nullptr && root->right == nullptr) {
if (path.size() > longest.size()) {
longest = path;
}
}
findLongestPath(root->left, path, longest);
findLongestPath(root->right, path, longest);
path.pop_back();
}
// 输出二叉树中每个叶子节点到根节点的路径
void printPathsToLeaves(TreeNode* root) {
std::vector<int> path;
printPathsToLeavesHelper(root, path);
}
void printPathsToLeavesHelper(TreeNode* root, std::vector<int>& path) {
if (root == nullptr) {
return;
}
path.push_back(root->val);
if (root->left == nullptr && root->right == nullptr) {
std::cout << "路径:";
for (int i = path.size() - 1; i >= 0; i--) {
std::cout << path[i] << " ";
}
std::cout << std::endl;
}
printPathsToLeavesHelper(root->left, path);
printPathsToLeavesHelper(root->right, path);
path.pop_back();
}
// 测试函数
int main() {
TreeNode* root = buildBinaryTree();
std::cout << "叶子节点个数:" << countLeafNodes(root) << std::endl;
swapChildren(root);
std::cout << "交换左右孩子后的二叉树:" << std::endl;
// 输出二叉树的代码略去,您可以根据需要添加相应的输出函数
std::cout << "最大宽度:" << maxWidth(root) << std::endl;
std::vector<int> longestPath = longestPath(root);
std::cout << "最长路径:";
for (int i = 0; i < longestPath.size(); i++) {
std::cout << longestPath[i] << " ";
}
std::cout << std::endl;
std::cout << "叶子节点到根节点的路径:" << std::endl;
printPathsToLeaves(root);
return 0;
}
如有用,请采纳