完成实验内容,本实验使用C语言/C++
时间: 2024-11-22 09:48:38 浏览: 25
为了完成实验内容,你需要编写两个主要部分:二叉树的基本操作和二叉树的遍历算法。以下是详细的步骤和代码示例:
### 实验题 1: 二叉树的基本操作
#### 目的
领会二叉链存储结构和掌握二叉树中各种基本运算算法的设计。
#### 内容
1. **创建二叉链存储结构**:
- 使用括号表示串 `A(B(D,E(H(J,K(L,M(,N)))),C(F,G(,I)))` 创建二叉链存储结构 `b`。
2. **输出二叉树 `b`**。
3. **输出节点 `H` 的左、右子节点值**。
4. **输出二叉树 `b` 的高度**。
5. **释放二叉树 `b`**。
#### 代码示例
```cpp
#include <iostream>
#include <cstring>
struct BTNode {
char data;
BTNode* lchild;
BTNode* rchild;
};
// 由括号表示串创建二叉链
void CreateBTree(BTNode*& b, const char* str) {
if (*str == '\0') return;
b = new BTNode;
b->data = *str++;
if (*str == '(') {
++str;
CreateBTree(b->lchild, str);
while (*str != ')' && *str != ',') ++str;
if (*str == ')') {
b->rchild = nullptr;
} else {
++str;
CreateBTree(b->rchild, str);
++str; // 跳过右括号
}
} else {
b->lchild = nullptr;
b->rchild = nullptr;
}
}
// 查找节点
BTNode* FindNode(BTNode* b, char x) {
if (!b) return nullptr;
if (b->data == x) return b;
BTNode* left = FindNode(b->lchild, x);
if (left) return left;
return FindNode(b->rchild, x);
}
// 获取左孩子节点
BTNode* LchildNode(BTNode* p) {
return p ? p->lchild : nullptr;
}
// 获取右孩子节点
BTNode* RchildNode(BTNode* p) {
return p ? p->rchild : nullptr;
}
// 计算二叉树的高度
int BTHeight(BTNode* b) {
if (!b) return 0;
int leftHeight = BTHeight(b->lchild);
int rightHeight = BTHeight(b->rchild);
return 1 + std::max(leftHeight, rightHeight);
}
// 以括号表示法输出二叉树
void DispBTree(BTNode* b) {
if (!b) return;
std::cout << b->data;
if (b->lchild || b->rchild) {
std::cout << "(";
DispBTree(b->lchild);
if (b->rchild) std::cout << ",";
DispBTree(b->rchild);
std::cout << ")";
}
}
// 释放二叉树的所有节点
void DestoryBTree(BTNode*& b) {
if (b) {
DestoryBTree(b->lchild);
DestoryBTree(b->rchild);
delete b;
b = nullptr;
}
}
int main() {
const char* str = "A(B(D,E(H(J,K(L,M(,N)))),C(F,G(,I)))";
BTNode* b = nullptr;
CreateBTree(b, str);
std::cout << "二叉树 b: ";
DispBTree(b);
std::cout << std::endl;
BTNode* h = FindNode(b, 'H');
if (h) {
char leftChild = LchildNode(h) ? LchildNode(h)->data : ' ';
char rightChild = RchildNode(h) ? RchildNode(h)->data : ' ';
std::cout << "H 结点的左孩子: " << leftChild << ", 右孩子: " << rightChild << std::endl;
}
std::cout << "二叉树 b 的高度: " << BTHeight(b) << std::endl;
DestoryBTree(b);
return 0;
}
```
### 实验题 2: 二叉树的遍历算法
#### 目的
领会二叉树的各种遍历过程及遍历算法设计。
#### 内容
1. **实现二叉树的中序遍历递归算法**。
2. **实现二叉树的后序遍历递归算法**。
3. **实现二叉树的层次遍历算法**。
4. **对实验题 1 中所示的二叉树 `b` 给出求解结果**。
#### 代码示例
```cpp
#include <queue>
// 中序遍历递归算法
void InOrder(BTNode* b) {
if (b) {
InOrder(b->lchild);
std::cout << b->data << " ";
InOrder(b->rchild);
}
}
// 后序遍历递归算法
void PostOrder(BTNode* b) {
if (b) {
PostOrder(b->lchild);
PostOrder(b->rchild);
std::cout << b->data << " ";
}
}
// 层次遍历算法
void TravLevel(BTNode* b) {
if (!b) return;
std::queue<BTNode*> q;
q.push(b);
while (!q.empty()) {
BTNode* node = q.front();
q.pop();
std::cout << node->data << " ";
if (node->lchild) q.push(node->lchild);
if (node->rchild) q.push(node->rchild);
}
}
int main() {
const char* str = "A(B(D,E(H(J,K(L,M(,N)))),C(F,G(,I)))";
BTNode* b = nullptr;
CreateBTree(b, str);
std::cout << "中序遍历: ";
InOrder(b);
std::cout << std::endl;
std::cout << "后序遍历: ";
PostOrder(b);
std::cout << std::endl;
std::cout << "层次遍历: ";
TravLevel(b);
std::cout << std::endl;
DestoryBTree(b);
return 0;
}
```
### 总结
通过上述代码,你可以完成二叉树的基本操作(包括创建、输出、查找子节点、计算高度和释放)以及二叉树的遍历(中序、后序和层次)。这些代码示例提供了完整的实现,并且可以运行来验证实验结果。
阅读全文