希望看到的兄弟能快速作答
1.建立二叉树,统计二叉树中度为2的结点个数和叶子结点个数( 用递归或非递归的方法都可以,先序、中序或后序均可)
(要求能够输入树的各个结点;分别建立二叉树存储结构的输入函数、输出中度为2的结点及个数的函数、输出叶子结点及个数的函数。)
2.(附带算法设计)选取的数据结构的描述;算法思路的描述;流程图;函数介绍
3.(附带收获及体会)可写调试过程中遇到的问题及解决办法,也可写算法设计思路方面的收货,还可以写对数据结构的理解,
#include <stdio.h>
#include <stdlib.h>
struct Node {
int data;
struct Node* left;
struct Node* right;
};
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("内存分配失败!");
exit(1);
}
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
struct Node* insertNode(struct Node* root, int data) {
if (root == NULL) {
root = createNode(data);
} else if (data <= root->data) {
root->left = insertNode(root->left, data);
} else {
root->right = insertNode(root->right, data);
}
return root;
}
int countNodesWithDegree2(struct Node* root) {
if (root == NULL)
return 0;
int count = 0;
if (root->left != NULL && root->right != NULL)
count++;
count += countNodesWithDegree2(root->left);
count += countNodesWithDegree2(root->right);
return count;
}
int countLeafNodes(struct Node* root) {
if (root == NULL)
return 0;
if (root->left == NULL && root->right == NULL)
return 1;
return countLeafNodes(root->left) + countLeafNodes(root->right);
}
void inorderTraversal(struct Node* root) {
if (root != NULL) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
int main() {
struct Node* root = NULL;
int data, choice;
do {
printf("请输入节点的值:");
scanf("%d", &data);
root = insertNode(root, data);
printf("继续插入节点吗?(1表示是,0表示否):");
scanf("%d", &choice);
} while (choice != 0);
printf("中序遍历二叉树:");
inorderTraversal(root);
printf("\n");
int count2 = countNodesWithDegree2(root);
printf("度为2的节点个数:%d\n", count2);
int countLeaf = countLeafNodes(root);
printf("叶子节点个数:%d\n", countLeaf);
return 0;
}
数据结构描述:
使用二叉树结构存储节点,每个节点包含一个整数值以及左右子节点的指针。
算法思路:
左右子节点都不为空,则说明该节点的度为2,计数器加1,然后递归遍历其左右子树。
函数介绍:
createNode(int data)
: 创建一个包含给定数据的新节点,并返回该节点的指针。insertNode(struct Node* root, int data)
: 在二叉树中插入一个新节点,按照节点值的大小关系将其放入左子树或右子树,返回更新后的根节点。countNodesWithDegree2(struct Node* root)
: 统计二叉树中度为2的节点个数,使用递归方法遍历每个节点并计数。countLeafNodes(struct Node* root)
: 统计二叉树中叶子节点个数,使用递归方法遍历每个节点并计数。inorderTraversal(struct Node* root)
: 中序遍历二叉树,以升序输出节点值。程序崩溃或出现段错误:这通常是由于内存访问错误或指针问题导致的。可以使用调试器(如GDB)来跟踪程序执行,找出引发错误的代码行,并检查是否有未初始化的指针或越界访问的情况。
递归函数无限循环或结果错误:递归函数的正确性很容易受到终止条件和递归调用的顺序影响。确保在递归函数中正确设置终止条件,并按照正确的顺序调用递归函数来遍历二叉树的节点。
输出结果与预期不符:在输出结果不符合预期时,可以使用打印语句或调试器来检查程序中间结果。验证每个函数的实现是否正确,特别是统计函数是否正确遍历了所有节点并正确计数。
内存泄漏:在动态分配内存时,需要确保在不再使用时进行正确的释放,避免内存泄漏。确保在每次创建节点后都有相应的释放操作,并在程序结束时释放整个二叉树的内存。
解决这些问题的方法包括:
仔细检查代码,特别是涉及指针操作的部分,确保指针的正确初始化、赋值和使用。
使用调试工具来跟踪程序执行,查看变量的值、函数的调用栈以及任何错误提示。
添加适当的日志输出或打印语句,以便在运行过程中查看中间结果。
检查边界情况和特殊输入,确保程序在处理极端情况时仍能正常工作。
与他人讨论问题,寻求他们的意见和建议。有时候,其他人的观点和思路可以帮助我们发现问题所在。
源于chatGPT仅供参考
1. 建立二叉树,统计二叉树中度为2的结点个数和叶子结点个数
```python
# 定义二叉树节点
class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# 递归建立二叉树
def buildTree():
value = input("请输入节点值(输入'None'表示空节点):")
if value == "None":
return None
node = Node(value)
node.left = buildTree()
node.right = buildTree()
return node
# 统计二叉树中度为2的节点个数和叶子节点个数
def countNodes(root):
if root is None:
return 0, 0
left_degree, left_leaf = countNodes(root.left)
right_degree, right_leaf = countNodes(root.right)
degree = left_degree + right_degree
leaf = left_leaf + right_leaf
if root.left and root.right:
degree += 1
elif not root.left and not root.right:
leaf += 1
return degree, leaf
# 输入函数
root = buildTree()
# 输出度为2的节点及个数
degree, _ = countNodes(root)
print("度为2的节点个数:", degree)
# 输出叶子节点及个数
_, leaf = countNodes(root)
print("叶子节点个数:", leaf)
数据结构描述:
算法思路:
流程图:
开始
├─ 输入节点值(包括空节点)
│ ├─ 若为"None",返回空节点
│ ├─ 创建新节点,赋值为输入值
│ ├─ 递归调用左子树建立函数
│ └─ 递归调用右子树建立函数
├─ 统计度为2的节点和叶子节点个数
│ ├─ 若根节点为空,返回0, 0
│ ├─ 递归获取左子树度为2的节点个数和叶子节点个数
│ ├─ 递归获取右子树度为2的节点个数和叶子节点个数
│ ├─ 统计总的度为2的节点个数(加上根节点)
│ └─ 统计总的叶子节点个数(加上根节点)
├─ 输出度为2的节点个数
└─ 输出叶子节点个数
结束
函数介绍:
buildTree()
: 输入函数,递归建立二叉树并返回根节点。countNodes(root)
: 统计二叉树中度为2的节点个数和叶子节点个数,返回度为2的节点个数和叶子节点个数。```
typedef struct TreeNode {
int data; // 节点的数据
struct TreeNode* left; // 左子树指针
struct TreeNode* right; // 右子树指针
} TreeNode;
TreeNode* createNode(int data) {
// 创建一个新节点,并初始化数据和子树指针
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
TreeNode* createBinaryTree() {
int data;
printf("请输入根节点的值(-1表示空节点):");
scanf("%d", &data);
if (data == -1) {
return NULL;
}
// 创建根节点
TreeNode* root = createNode(data);
// 递归创建左子树
printf("请输入节点%d的左子节点:", data);
root->left = createBinaryTree();
// 递归创建右子树
printf("请输入节点%d的右子节点:", data);
root->right = createBinaryTree();
return root;
}
// 统计二叉树中度为2的结点个数和叶子结点个数
void countNodes(TreeNode * root, int* degree2, int* leaf) {
if (root == NULL) {
return;
}
// 判断当前节点的度
if (root->left != NULL && root->right != NULL) {
(*degree2)++;
}
else if (root->left == NULL && root->right == NULL) {
(*leaf)++;
}
// 递归统计左子树和右子树
countNodes(root->left, degree2, leaf);
countNodes(root->right, degree2, leaf);
}
// 输出二叉树中度为2的结点及个数
void printDegree2Nodes(TreeNode* root, int* count) {
if (root == NULL) {
return;
}
// 递归输出左子树和右子树
printDegree2Nodes(root->left, count);
printDegree2Nodes(root->right, count);
// 判断当前节点的度
if (root->left != NULL && root->right != NULL) {
printf("节点%d是度为2的结点\n", root->data);
(*count)++;
}
}
// 输出二叉树中叶子结点及个数
void printLeafNodes(TreeNode* root, int* count) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
printf("节点%d是叶子结点\n", root->data);
(*count)++;
}
printLeafNodes(root->left, count);
printLeafNodes(root->right, count);
}
int main() {
TreeNode* root = createBinaryTree();
int degree2 = 0;
int leaf = 0;
countNodes(root, °ree2, &leaf);
printf("度为2的结点个数:%d\n", degree2);
printf("叶子结点个数:%d\n", leaf);
int count = 0;
printf("度为2的结点列表:\n");
printDegree2Nodes(root, &count);
if (count == 0) {
printf("无度为2的结点\n");
}
count = 0;
printf("叶子结点列表:\n");
printLeafNodes(root, &count);
if (count == 0) {
printf("无叶子结点\n");
}
return 0;
}
我之前的:需不需要,完整的报告
#include<iostream>
using namespace std;
void countsort(int a[],int b[],int n)
{
//遍历每一趟
int count=0;
for(int i=0;i<n;i++)
{
//找到每个元素小的个数
count = 0;
for(int j=0;j<n;j++)
{
if(a[j]<a[i]) count++;
}
b[count] = a[i];
}
}
int main()
{
int a[6]={3,5,7,2,4,9},b[6];
countsort(a,b,6);
for(int i=0;i<6;i++) cout<<b[i]<<" ";
return 0;
}