如何使用C++实现基于二叉链表表示的二叉树,根据给定的先序遍历序列(以A,B,D,*,E,*,C,F,*,*)构建二叉树,并执行中序遍历,输出所有节点的值?
时间: 2024-10-21 13:01:38 浏览: 46
数据结构试验3二叉树建立,遍历等
在C++中,我们可以使用递归的方式来实现基于二叉链表表示的二叉树。首先,我们需要定义一个结构体来代表二叉树节点,包含数据、左指针和右指针:
```cpp
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
```
然后,我们可以创建一个函数来根据先序遍历序列构造二叉树。这里我们假设`*`代表空节点:
```cpp
TreeNode* buildTree(std::vector<char>& preorder, int start, int end) {
if (start > end) return nullptr; // 如果已经到序列末尾,返回空节点
int root_val = preorder[start]; // 先序遍历的第一个元素作为根节点值
TreeNode* root = new TreeNode(root_val);
int i = 0; // 中序遍历查找根的位置
for (; i <= end && preorder[i] != '*'; ++i) {} // 找到根节点在中序遍历中的位置
// 分别递归构建左子树和右子树
root->left = buildTree(preorder, start + 1, i - 1);
root->right = buildTree(preorder, i + 1, end);
return root;
}
```
对于给定的先序遍历 `A, B, D, *, E, *, C, F, *, *`,你可以通过这个函数创建二叉树。
接下来,我们实现中序遍历并打印节点值:
```cpp
void inorderTraversal(TreeNode* root) {
if (root == nullptr) return;
inorderTraversal(root->left);
std::cout << root->val << " ";
inorderTraversal(root->right);
}
int main() {
std::vector<char> preorder = {'A', 'B', 'D', '*', 'E', '*', 'C', 'F', '*', '*'};
TreeNode* root = buildTree(preorder, 0, preorder.size() - 1);
inorderTraversal(root);
std::cout << "\n";
return 0;
}
```
运行上述程序,会输出中序遍历的结果。注意这只是一个基础示例,实际操作中可能需要处理更复杂的情况,例如输入的有效性检查。执行完中序遍历后,树的所有节点值会被输出。
阅读全文