利用c++设一棵二叉树以二叉链表表示, a) 实现由先序、中序序列构造二叉树的算法 b) 实现由后序、中序序列构造二叉树的算法
时间: 2024-11-20 10:39:02 浏览: 9
链表先序建立二叉树,得到中序后序输出,递归和非递归实现(C++代码加设计报告)
5星 · 资源好评率100%
在C++中,我们可以使用链表表示二叉树,通过先序遍历、中序遍历或后序遍历来构建二叉树。以下是分别利用先序(根-左-右)、中序(左-根-右)和后序(左-右-根)序列构造二叉树的算法:
a) 先序遍历(Preorder)- 根据根节点 -> 左子树 -> 右子树的顺序:
```cpp
template <typename T>
class TreeNode {
public:
T val;
TreeNode* left;
TreeNode* right;
TreeNode(T x) : val(x), left(nullptr), right(nullptr) {}
};
void buildTreeFromPreInOrder(vector<T>& preOrder, vector<T>& inOrder, int start, int end) {
if (start > end)
return;
TreeNode<T>* root = new TreeNode(preOrder[start]);
int index = find(inOrder.begin(), inOrder.end(), preOrder[start]);
root->left = buildTreeFromPreInOrder(preOrder, inOrder, start + 1, index - 1);
root->right = buildTreeFromPreInOrder(preOrder, inOrder, index + 1, end);
return root;
}
vector<T> preOrder, inOrder;
// 填充preOrder和inOrder,例如:
TreeNode<int>* tree = buildTreeFromPreInOrder(preOrder, inOrder, 0, preOrder.size() - 1);
```
b) 后序遍历(Postorder)- 根据左子树 -> 右子树 -> 根节点的顺序:
```cpp
void buildTreeFromPostInOrder(vector<T>& postOrder, vector<T>& inOrder, int start, int end) {
if (start > end)
return;
TreeNode<T>* root = nullptr;
for (int i = start; i <= end; ++i) {
if (find(inOrder.begin(), inOrder.end(), postOrder[i]) == inOrder.begin())
root = new TreeNode(postOrder[i]);
}
int index = find(inOrder.begin(), inOrder.end(), root->val);
root->left = buildTreeFromPostInOrder(postOrder, inOrder, start, index - 1);
root->right = buildTreeFromPostInOrder(postOrder, inOrder, index + 1, end);
return root;
}
// 使用后序和中序同样创建树
TreeNode<int>* tree2 = buildTreeFromPostInOrder(postOrder, inOrder, 0, postOrder.size() - 1);
```
这两个函数都会根据提供的序列创建一个完整的二叉树结构。注意,在实际应用中,你需要确保输入的序列有效,并提供适当的起点和终点参数。
阅读全文