使用二叉链表来实现二叉树的存储,编写以下算法:\n(1)二叉树的创建\n(2)二叉树的前序、中序、后序、层次遍历\n(3)完善main()函数的编写,调用以上算法,验证算法的正确性
时间: 2023-09-15 13:02:28 浏览: 174
### 回答1:
(1)二叉树的创建:
二叉树的创建可以通过递归的方式来实现,具体步骤如下:
1. 如果当前节点为空,则新建一个节点,并将其赋值给当前节点。
2. 如果当前节点不为空,则根据二叉树的性质,将新节点插入到左子树或右子树中。
3. 递归创建左子树和右子树。
代码如下:
```
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* createTree() {
int val;
scanf("%d", &val);
if (val == -1) {
return NULL;
}
TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
root->val = val;
root->left = createTree();
root->right = createTree();
return root;
}
```
(2)二叉树的前序、中序、后序、层次遍历:
二叉树的遍历可以通过递归的方式来实现,具体步骤如下:
1. 前序遍历:先访问根节点,再访问左子树,最后访问右子树。
2. 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
3. 后序遍历:先访问左子树,再访问右子树,最后访问根节点。
4. 层次遍历:从根节点开始,按照层次依次访问每个节点。
代码如下:
```
void preOrder(TreeNode* root) {
if (root == NULL) {
return;
}
printf("%d ", root->val);
preOrder(root->left);
preOrder(root->right);
}
void inOrder(TreeNode* root) {
if (root == NULL) {
return;
}
inOrder(root->left);
printf("%d ", root->val);
inOrder(root->right);
}
void postOrder(TreeNode* root) {
if (root == NULL) {
return;
}
postOrder(root->left);
postOrder(root->right);
printf("%d ", root->val);
}
void levelOrder(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
printf("%d ", node->val);
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
}
```
(3)完善main()函数的编写,调用以上算法,验证算法的正确性:
代码如下:
```
int main() {
TreeNode* root = createTree();
printf("前序遍历:");
preOrder(root);
printf("\n中序遍历:");
inOrder(root);
printf("\n后序遍历:");
postOrder(root);
printf("\n层次遍历:");
levelOrder(root);
printf("\n");
return ;
}
```
输入样例:
```
1 2 -1 -1 3 4 -1 -1 5 -1 -1
```
输出样例:
```
前序遍历:1 2 3 4 5
中序遍历:2 1 4 3 5
后序遍历:2 4 5 3 1
层次遍历:1 2 3 4 5
```
### 回答2:
(1)二叉树的创建:
使用二叉链表来实现二叉树的存储,每个节点包含数据域和指向左右子树的指针域。可以根据输入的数据创建二叉树。
具体算法如下:
1. 创建二叉树结点结构,并定义指向左右子树的指针。
2. 输入根节点的数据。
3. 如果输入的数据为特殊值(比如-1),则表示此结点为空。否则,创建一个新的结点,并将输入的数据赋值给结点的数据域。
4. 递归地创建左子树和右子树。
(2)二叉树的遍历:
前序遍历(递归):
1. 若二叉树为空,结束。
2. 输出根节点的数据。
3. 递归地前序遍历左子树。
4. 递归地前序遍历右子树。
中序遍历(递归):
1. 若二叉树为空,结束。
2. 递归地中序遍历左子树。
3. 输出根节点的数据。
4. 递归地中序遍历右子树。
后序遍历(递归):
1. 若二叉树为空,结束。
2. 递归地后序遍历左子树。
3. 递归地后序遍历右子树。
4. 输出根节点的数据。
层次遍历:
1. 若二叉树为空,结束。
2. 创建一个队列,将根节点入队。
3. 当队列非空时,执行以下操作:
- 出队一个结点,并输出该结点的数据。
- 如果该结点有左孩子,则左孩子入队。
- 如果该结点有右孩子,则右孩子入队。
(3)完善main()函数的编写,调用以上算法,验证算法的正确性:
```cpp
#include <iostream>
#include <queue>
using namespace std;
// 二叉树结点结构定义
struct Node
{
int data;
Node* left;
Node* right;
};
// 创建二叉树
Node* createBinaryTree()
{
int data;
cin >> data;
if (data == -1)
{
return nullptr;
}
Node* root = new Node;
root->data = data;
cout << "请输入" << data << "的左子树:";
root->left = createBinaryTree();
cout << "请输入" << data << "的右子树:";
root->right = createBinaryTree();
return root;
}
// 前序遍历(递归)
void preOrderTraversal(Node* root)
{
if (root == nullptr)
{
return;
}
cout << root->data << " ";
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历(递归)
void inOrderTraversal(Node* root)
{
if (root == nullptr)
{
return;
}
inOrderTraversal(root->left);
cout << root->data << " ";
inOrderTraversal(root->right);
}
// 后序遍历(递归)
void postOrderTraversal(Node* root)
{
if (root == nullptr)
{
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
cout << root->data << " ";
}
// 层次遍历
void levelOrderTraversal(Node* root)
{
if (root == nullptr)
{
return;
}
queue<Node*> q;
q.push(root);
while (!q.empty())
{
Node* front = q.front();
q.pop();
cout << front->data << " ";
if (front->left != nullptr)
{
q.push(front->left);
}
if (front->right != nullptr)
{
q.push(front->right);
}
}
}
int main()
{
cout << "请输入根节点:";
Node* root = createBinaryTree();
cout << "前序遍历结果:";
preOrderTraversal(root);
cout << endl;
cout << "中序遍历结果:";
inOrderTraversal(root);
cout << endl;
cout << "后序遍历结果:";
postOrderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
以上是使用二叉链表来实现二叉树的存储,并实现了二叉树的创建、前序、中序、后序和层次遍历的算法。在main()函数中,调用了这些算法,并用输入的数据来验证算法的正确性。
### 回答3:
(1)二叉树的创建:
使用二叉链表来实现二叉树的存储,可以定义一个二叉树结点的数据结构,该结构包括一个数据域(存储结点中的数据元素)和两个指针,分别指向当前结点的左孩子和右孩子。二叉树的创建可以通过递归来实现,具体步骤如下:
1. 首先创建一个空的二叉树根节点,设为root;
2. 输入一个数据元素,创建一个新的结点,并将该数据元素赋值给结点的数据域;
3. 输入是否有左孩子,如果有,则递归调用创建二叉树的函数,并将返回的结点指针赋值给当前结点的左指针;如果没有左孩子,左指针设为NULL;
4. 输入是否有右孩子,如果有,则递归调用创建二叉树的函数,并将返回的结点指针赋值给当前结点的右指针;如果没有右孩子,右指针设为NULL;
5. 返回根节点root。
(2)二叉树的前序、中序、后序、层次遍历:
- 前序遍历:先输出当前结点,然后再依次递归遍历左子树和右子树。可以使用递归来实现前序遍历。
- 中序遍历:先递归遍历左子树,然后输出当前结点,最后再递归遍历右子树。可以使用递归来实现中序遍历。
- 后序遍历:先递归遍历左子树,然后再递归遍历右子树,最后输出当前结点。可以使用递归来实现后序遍历。
- 层次遍历:使用一个队列来实现层次遍历。首先将根节点入队,然后循环执行以下步骤:出队一个结点,输出该结点的数据,将该结点的左右孩子依次入队。
(3)完善main()函数的编写,调用以上算法,验证算法的正确性:可以编写一个main()函数来测试二叉树的创建和各种遍历算法的正确性。以下是一个示例:
```cpp
#include<iostream>
#include<queue>
using namespace std;
// 定义二叉树结点
struct TreeNode {
int data;
TreeNode* left;
TreeNode* right;
TreeNode(int val) : data(val), left(NULL), right(NULL) {};
};
// 创建二叉树
TreeNode* createBinaryTree() {
int val;
cin >> val;
if (val == -1) {
return NULL; // 输入-1表示空结点
}
TreeNode* root = new TreeNode(val);
cout << "请输入" << val << "的左子结点:";
root->left = createBinaryTree();
cout << "请输入" << val << "的右子结点:";
root->right = createBinaryTree();
return root;
}
// 前序遍历
void preOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->data << " ";
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历
void inOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
cout << root->data << " ";
inOrderTraversal(root->right);
}
// 后序遍历
void postOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
cout << root->data << " ";
}
// 层次遍历
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->data << " ";
if (node->left) {
q.push(node->left);
}
if (node->right) {
q.push(node->right);
}
}
}
int main() {
TreeNode* root = createBinaryTree();
cout << "前序遍历结果:";
preOrderTraversal(root);
cout << endl;
cout << "中序遍历结果:";
inOrderTraversal(root);
cout << endl;
cout << "后序遍历结果:";
postOrderTraversal(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
以上代码实现了二叉树的创建和在控制台输出前序、中序、后序、层次遍历结果,可以通过输入一棵二叉树的数据来验证算法的正确性。
阅读全文