代码实现二叉树先序,中序,后序遍历,以及由先序和后序恢复二叉树
时间: 2024-11-20 12:43:36 浏览: 20
当然,我很乐意帮助你理解并实现二叉树的遍历和重构。
**1. ** **二叉树的遍历**
- **先序遍历(Preorder Traversal)**: 先访问根节点,然后递归地遍历左子树,最后遍历右子树。
```c
void preorder(struct TreeNode* root) {
if (root != NULL) {
printf("%d ", root->val); // 访问根
preorder(root->left); // 左子树
preorder(root->right); // 右子树
}
}
```
- **中序遍历(Inorder Traversal)**: 先递归地遍历左子树,然后访问根节点,最后遍历右子树。
```c
void inorder(struct TreeNode* root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->val); // 访问根
inorder(root->right);
}
}
```
- **后序遍历(Postorder Traversal)**: 先递归地遍历左子树和右子树,最后访问根节点。
```c
void postorder(struct TreeNode* root) {
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("%d ", root->val); // 访问根
}
}
```
**2. ** **从先序和后序遍历重建二叉树(Reconstructing Tree from Preorder and Postorder)**
这种方法通常使用线索二叉树(也叫带附加信息的二叉树),因为在给定的两个序列中,后序遍历中的最后一个元素总是根节点,而这个信息可以帮助我们定位左右子树的位置。下面是基本步骤:
- 遍历后序序列,找到最后一个元素(根节点)。
- 根据先序序列,找到根节点对应的值。
- 将根节点插入到新树中。
- 分别对左右子树进行同样的操作,直到所有节点都添加完毕。
这里没有直接的代码示例,因为重建过程需要手动处理线索或使用动态数据结构(如栈)来存储临时信息,但主要思路就是这样。
阅读全文