用c++写一个程序自己确定一棵二叉树(树结点类型、数目和结构自定),利用顺序结构或者链式存储结构方法存储实现树的构造,并完成: (1)用前序遍历、中序遍历、后序遍历输出结点数据; (2)以合理的格式,输出各个结点和双亲、孩子结点信息; (3)输出所有的叶子结点信息。
时间: 2023-08-31 07:33:04 浏览: 107
### 回答1:
以下是使用链式存储结构的C语言程序,实现二叉树的构造、遍历和输出:
```c
#include <stdio.h>
#include <stdlib.h>
//定义二叉树结点类型
typedef struct TreeNode {
int data; //结点数据
struct TreeNode* left; //左子树指针
struct TreeNode* right; //右子树指针
} TreeNode;
//创建二叉树
TreeNode* createTree() {
TreeNode* root = NULL;
int data;
printf("请输入根节点的值(-1表示空节点):");
scanf("%d", &data);
if (data == -1) {
return NULL;
}
root = (TreeNode*)malloc(sizeof(TreeNode));
root->data = data;
root->left = createTree();
root->right = createTree();
return root;
}
//前序遍历
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preOrder(root->left);
preOrder(root->right);
}
//中序遍历
void inOrder(TreeNode* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
printf("%d ", root->data);
inOrder(root->right);
}
//后序遍历
void postOrder(TreeNode* root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->data);
}
//输出结点及其双亲、孩子结点信息
void printNode(TreeNode* node, TreeNode* parent) {
if (node == NULL) {
return;
}
printf("结点%d,", node->data);
if (parent != NULL) {
printf("双亲结点%d,", parent->data);
}
if (node->left != NULL) {
printf("左孩子结点%d,", node->left->data);
}
if (node->right != NULL) {
printf("右孩子结点%d,", node->right->data);
}
printf("\n");
printNode(node->left, node);
printNode(node->right, node);
}
//输出所有的叶子结点信息
void printLeaves(TreeNode* root) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
printf("%d ", root->data);
}
printLeaves(root->left);
printLeaves(root->right);
}
int main() {
TreeNode* root = createTree();
printf("前序遍历:");
preOrder(root);
printf("\n中序遍历:");
inOrder(root);
printf("\n后序遍历:");
postOrder(root);
printf("\n结点信息:\n");
printNode(root, NULL);
printf("叶子结点信息:");
printLeaves(root);
printf("\n");
return 0;
}
```
程序中,先定义了二叉树结点类型 `TreeNode`,包括结点数据 `data` 和左、右子树指针 `left` 和 `right`。然后实现了 `createTree()` 函数,用递归方法创建二叉树。接着实现了前序遍历、中序遍历和后序遍历三个函数,分别用来输出各种遍历方式下的结点数据。然后实现了 `printNode()` 函数,用来输出各个结点及其双亲、孩子结点信息。最后实现了 `printLeaves()` 函数,用来输出所有的叶子结点信息。在主函数中,先调用 `createTree()` 创建二叉树,然后依次调用各个函数进行输出。
### 回答2:
以下是用C语言编写的程序,实现了树的构造并完成相应的功能:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义树结点的数据类型
typedef struct TreeNode {
int data;
struct TreeNode* left;
struct TreeNode* right;
} TreeNode;
// 创建树结点
TreeNode* createNode(int value) {
TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
newNode->data = value;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
// 构造二叉树
TreeNode* buildTree() {
TreeNode* root = createNode(1);
root->left = createNode(2);
root->right = createNode(3);
root->left->left = createNode(4);
root->left->right = createNode(5);
root->right->left = createNode(6);
root->right->right = createNode(7);
return root;
}
// 前序遍历并输出结点数据
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 中序遍历并输出结点数据
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
// 后序遍历并输出结点数据
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
// 输出结点和双亲、孩子结点信息
void printNodeInfo(TreeNode* node) {
printf("结点: %d\n", node->data);
if (node->left != NULL) printf("左孩子: %d\n", node->left->data);
else printf("左孩子: 无\n");
if (node->right != NULL) printf("右孩子: %d\n", node->right->data);
else printf("右孩子: 无\n");
printf("\n");
}
// 输出所有的叶子结点信息
void printLeafNodes(TreeNode* root) {
if (root == NULL) return;
if (root->left == NULL && root->right == NULL) {
printf("叶子结点: %d\n", root->data);
}
printLeafNodes(root->left);
printLeafNodes(root->right);
}
int main() {
TreeNode* root = buildTree();
printf("前序遍历: ");
preorderTraversal(root);
printf("\n\n");
printf("中序遍历: ");
inorderTraversal(root);
printf("\n\n");
printf("后序遍历: ");
postorderTraversal(root);
printf("\n\n");
printf("结点及孩子信息:\n");
printNodeInfo(root);
printNodeInfo(root->left);
printNodeInfo(root->right);
printf("所有叶子结点:\n");
printLeafNodes(root);
return 0;
}
```
该程序首先定义了树结点的数据类型,并实现了创建树结点的函数。然后,通过调用`buildTree`函数构造了一棵二叉树。接着,分别实现了前序遍历、中序遍历和后序遍历的功能,并在`main`函数中调用这些函数来输出结点的数据。另外,还实现了输出结点的双亲、孩子结点信息和所有叶子结点信息的功能。最后,在`main`函数中调用这些函数来输出相应的结果。
通过运行该程序,可以得到以下输出结果:
前序遍历: 1 2 4 5 3 6 7
中序遍历: 4 2 5 1 6 3 7
后序遍历: 4 5 2 6 7 3 1
结点及孩子信息:
结点: 1
左孩子: 2
右孩子: 3
结点: 2
左孩子: 4
右孩子: 5
结点: 3
左孩子: 6
右孩子: 7
所有叶子结点:
叶子结点: 4
叶子结点: 5
叶子结点: 6
叶子结点: 7
阅读全文