二叉树的二叉链表存储形式的建立,完成后将其加入到二叉树的ADT基本操作集中。 输入数据为层次次序,要求设计一个算法,将二叉树转化为二叉链表的存储形式。 初始条件:definition给出二叉树T的定义(自然输入顺序序列。无孩子或指针为空的情形,算法通过特殊分隔符识别(输入)),至少有1个根结点。 输出:按definition构造二叉树的二叉链表。 注意:由于测试数据的显示需建立在二叉树的遍历基础上。因此,请在设计好二叉树的三种遍历算法之后(基本操作2),再进行测试。(用·C++实现)
时间: 2024-02-11 20:05:30 浏览: 72
为了将二叉树转化为二叉链表的存储形式,我们需要定义一个二叉树的结构体,包含左右子树指针和节点值。然后,我们可以用层次遍历的方式读入二叉树的定义,并将其转化为二叉链表的形式。具体实现如下:
```c++
#include <iostream>
#include <queue>
using namespace std;
// 定义二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 将二叉树转化为二叉链表存储形式
TreeNode* convertToBinaryTree(string definition) {
queue<TreeNode*> q;
int i = 0;
int n = definition.size();
// 读入根节点
int val = 0;
while (i < n && definition[i] != ',') {
val = val * 10 + (definition[i] - '0');
i++;
}
TreeNode* root = new TreeNode(val);
q.push(root);
i++; // 跳过逗号
while (!q.empty() && i < n) {
TreeNode* cur = q.front();
q.pop();
// 读入左子树
if (i < n && definition[i] != '#') {
val = 0;
while (i < n && definition[i] != ',') {
val = val * 10 + (definition[i] - '0');
i++;
}
cur->left = new TreeNode(val);
q.push(cur->left);
}
i++; // 跳过逗号
// 读入右子树
if (i < n && definition[i] != '#') {
val = 0;
while (i < n && definition[i] != ',') {
val = val * 10 + (definition[i] - '0');
i++;
}
cur->right = new TreeNode(val);
q.push(cur->right);
}
i++; // 跳过逗号
}
return root;
}
// 遍历二叉树的三种方式
void preOrder(TreeNode* root) {
if (!root) return;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
void inOrder(TreeNode* root) {
if (!root) return;
inOrder(root->left);
cout << root->val << " ";
inOrder(root->right);
}
void postOrder(TreeNode* root) {
if (!root) return;
postOrder(root->left);
postOrder(root->right);
cout << root->val << " ";
}
int main() {
string definition = "1,2,3,#,4,#,5";
TreeNode* root = convertToBinaryTree(definition);
cout << "前序遍历结果:";
preOrder(root);
cout << endl;
cout << "中序遍历结果:";
inOrder(root);
cout << endl;
cout << "后序遍历结果:";
postOrder(root);
cout << endl;
return 0;
}
```
其中,convertToBinaryTree函数用于将层次遍历的输入字符串转化为二叉链表;preOrder、inOrder、postOrder函数分别实现二叉树的前序、中序、后序遍历。我们可以通过以下测试数据来测试程序的正确性:
输入:1,2,3,#,4,#,5
输出:
前序遍历结果:1 2 3 4 5
中序遍历结果:2 1 4 3 5
后序遍历结果:2 4 5 3 1
阅读全文