假设二叉树采用二叉链存储,每个结点值为单个字符,并且所有结点值不相同。编写一个实验程序,由二叉树的中序序列和后序序列构造二叉树,实现查找、求高度、先序遍历、中序遍历、后序遍历算法和层次遍历算法,用相关数据进行测试,包括主程序
时间: 2024-01-15 13:05:48 浏览: 70
二叉树的二叉链表存储表示-java版数据结构-树结构
好的,以下是实验程序的实现。首先,我们需要定义二叉树结点的结构体:
```c++
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
```
接下来,我们可以编写构造二叉树的函数:
```c++
TreeNode* buildTree(vector<char>& inorder, vector<char>& postorder) {
if (inorder.empty() || postorder.empty()) return nullptr;
char rootVal = postorder.back();
TreeNode* root = new TreeNode(rootVal);
auto it = find(inorder.begin(), inorder.end(), rootVal);
int idx = it - inorder.begin();
vector<char> inorderLeft(inorder.begin(), it);
vector<char> inorderRight(it + 1, inorder.end());
vector<char> postorderLeft(postorder.begin(), postorder.begin() + idx);
vector<char> postorderRight(postorder.begin() + idx, postorder.end() - 1);
root->left = buildTree(inorderLeft, postorderLeft);
root->right = buildTree(inorderRight, postorderRight);
return root;
}
```
该函数的参数是二叉树的中序序列和后序序列,返回值是构造出的二叉树的根结点。我们可以先根据后序序列找到根结点的值,然后在中序序列中找到该值的位置,这样可以将中序序列分为左子树部分和右子树部分。接着,我们可以将后序序列也分为左子树部分和右子树部分,然后分别递归构造左子树和右子树。
接下来,我们可以实现各种遍历算法和求高度算法:
```c++
int height(TreeNode* root) {
if (!root) return 0;
return max(height(root->left), height(root->right)) + 1;
}
void preorderTraversal(TreeNode* root) {
if (!root) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) {
if (!root) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) {
if (!root) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
void levelTraversal(TreeNode* root) {
if (!root) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
auto cur = q.front();
q.pop();
cout << cur->val << " ";
if (cur->left) q.push(cur->left);
if (cur->right) q.push(cur->right);
}
cout << endl;
}
}
```
最后是主函数:
```c++
int main() {
vector<char> inorder = {'D', 'B', 'E', 'A', 'F', 'C'};
vector<char> postorder = {'D', 'E', 'B', 'F', 'C', 'A'};
auto root = buildTree(inorder, postorder);
cout << "Height: " << height(root) << endl;
cout << "Preorder traversal: ";
preorderTraversal(root);
cout << endl;
cout << "Inorder traversal: ";
inorderTraversal(root);
cout << endl;
cout << "Postorder traversal: ";
postorderTraversal(root);
cout << endl;
cout << "Level traversal: " << endl;
levelTraversal(root);
return 0;
}
```
在这个例子中,我们使用中序序列 `DBEAFC` 和后序序列 `DEBFCA` 来构造二叉树,并测试各种遍历算法和求高度算法。
阅读全文