C++:利用结构体编写一个程序, 在自定义函数中完成下列功能并在主函数进行测试:(1) 由树的先序遍历序列和中序遍历序列创建一棵二叉树。(2) 输出二叉树的后序遍历序列。测试数据:先序遍历序列: ABDGCEF↵中序遍历序列: DGBAECF↵
时间: 2024-10-29 21:25:29 浏览: 21
在C++中,我们可以首先定义一个结构体`Node`表示二叉树的节点,接着实现先序、中序遍历的递归函数以及后序遍历。这里是一个简单的示例:
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点结构
struct Node {
char data;
Node* left;
Node* right;
};
// 创建新节点
Node* createNode(char data) {
Node* newNode = new Node();
newNode->data = data;
newNode->left = newNode->right = nullptr;
return newNode;
}
// 先序遍历 (根 -> 左 -> 右)
void preOrder(Node* node) {
if (node != nullptr) {
cout << node->data << " ";
preOrder(node->left);
preOrder(node->right);
}
}
// 中序遍历 (左 -> 根 -> 右)
void inOrder(Node* node) {
if (node != nullptr) {
inOrder(node->left);
cout << node->data << " ";
inOrder(node->right);
}
}
// 后序遍历 (左 -> 右 -> 根)
void postOrder(Node* node) {
if (node != nullptr) {
postOrder(node->left);
postOrder(node->right);
cout << node->data << " ";
}
}
// 通过先序和中序遍历来构造二叉树
Node* buildTreeFromPreIn(string preStr, string inStr) {
int preIndex = 0, inIndex = 0;
Node* root = nullptr, *temp = nullptr;
for (int i = 0; i < inStr.length(); ++i) {
if (preStr[preIndex] == inStr[i]) { // 找到当前要构建的节点位置
temp = createNode(inStr[i]);
root = (root == nullptr ? temp : root->left) = findSubtree(preStr, inStr, preIndex, inIndex);
++preIndex;
} else {
++inIndex;
}
}
return root;
}
// 从两个字符串中找到对应的子树
Node* findSubtree(string str1, string str2, int& start1, int& start2) {
if (start1 >= str1.length()) return nullptr;
if (start2 >= str2.length()) return nullptr;
if (str1[start1] == str2[start2]) {
Node* newNode = createNode(str1[start1]);
start1++;
start2++;
newNode->left = findSubtree(str1, str2, start1, start2);
newNode->right = findSubtree(str1, str2, start1, start2);
return newNode;
} else {
return start1 < str1.length() ? findSubtree(str1, str2, start1 + 1, start2) : nullptr;
}
}
int main() {
string preOrderStr = "ABDGCEF";
string inOrderStr = "DGBAECF";
// 构造二叉树
Node* root = buildTreeFromPreIn(preOrderStr, inOrderStr);
// 输出二叉树的后序遍历序列
cout << "后序遍历序列: ";
postOrder(root);
return 0;
}
```
在这个示例中,我们首先定义了`Node`结构体,然后实现了遍历和构建二叉树的相关函数。在`main`函数中,我们使用给定的先序和中序遍历序列来创建树,并最后输出后序遍历序列。
阅读全文