设一棵二叉树的中序遍历序列为: C E I F G B A D H , 后序遍历序列为: E I C B G A H D F 求: (1)画出这棵二叉树。 (2)写出该二叉树的前序遍历序列。 (3)将这棵二叉树转换成对应的树(或森林)。
时间: 2023-06-19 11:05:51 浏览: 215
(1) 根据中序遍历序列和后序遍历序列可知根节点为F,因为后序遍历的最后一个元素为根节点,F在中序遍历中左侧的为左子树,右侧的为右子树;以此类推,递归构建整棵树,如下图所示:
```
F
/ \
C B
/ \ / \
E I G A
/ \
H D
```
(2) 该二叉树的前序遍历序列为:F C E I B G A H D
(3) 将该二叉树转换成对应的树(或森林)如下图所示:
```
F B
/ \ / \
C D G A
/ \ / \ \
E I H F D
\
B
/ \
G A
/
H
```
相关问题
python中设计一个算法,根据二叉树的后序遍历序列和中序遍历序列求其先序遍历序列
在Python中,可以根据二叉树的后序遍历序列(Postorder Traversal)和中序遍历序列(Inorder Traversal)推导出先序遍历序列(Preorder Traversal),这是因为这三个遍历顺序提供了足够的信息重建原树的结构。先来看一下如何利用这两个序列:
1. **后序遍历**(Postorder)的特点是根节点最后访问,左子树和右子树都是先访问。记作 `postorder`。
2. **中序遍历**(Inorder)的特点是左子树、根节点和右子树的顺序。对于找到某个节点,如果当前序列是左子树部分,则说明该节点还没访问;如果是根节点,那么接下来就是右子树;记作 `inorder`。
3. **先序遍历**(Preorder)的特点是根节点最先访问,然后左子树和右子树。我们可以通过已知的后序和中序序列逆向构造先序序列。
下面是步骤:
- 先确定根节点:从后序遍历开始,找到最后一个元素,这个就是根节点,因为它是后序遍历中最后一个访问的。
- 然后在中序遍历中,从左到右寻找这个根节点,当找到它的时候,它的左侧所有元素都属于左子树,右侧属于右子树。
- 左子树的先序遍历序列可以在中序遍历序列的左半部分找到,右子树的先序遍历序列在剩余的后序遍历序列中查找。
以下是一个简单的Python函数示例,实现了这个过程:
```python
def recover_preorder(postorder, inorder):
# 1. 找到后序遍历中的根节点
root_index = postorder.index(inorder[-1])
# 2. 构造前序遍历列表
preorder = [inorder[root_index]] # 根节点
left_inorder = inorder[:root_index] # 左子树的中序序列
right_postorder = postorder[1:-1] # 右子树的后序序列
# 3. 分别递归处理左右子树
left_preorder = recover_preorder(left_inorder, inorder[:root_index]) # 左子树
right_preorder = recover_preorder(right_postorder, inorder[root_index+1:]) # 右子树
return left_preorder + right_preorder + [inorder[root_index]]
# 测试数据
postorder = [9, 6, 10, 5, 3, 4, 7, 8, 2]
inorder = [9, 3, 1, 2, 4, 5, 6, 7, 8, 10]
preorder_result = recover_preorder(postorder, inorder)
print("先序遍历序列:", preorder_result)
创建二叉树,打出创建的实验源代码。 A B C D E # # # # F G # # #,其中 # 表示空节点。 先序遍历序列为:A B C D E F G 中序遍历序列为:D C E B A G F 后序遍历序列为:D E C B G F A
二叉树是一种重要的数据结构,它可以应用于各种场景。以下是创建二叉树的示例源代码,包括先序、中序和后序遍历。
```cpp
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* buildTree(vector<char>& preorder, vector<char>& inorder) {
return buildTreeHelper(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* buildTreeHelper(vector<char>& preorder, vector<char>& inorder, int p_left, int p_right, int i_left, int i_right) {
if (p_left > p_right) return NULL;
char root_val = preorder[p_left];
int root_index = i_left;
while (inorder[root_index] != root_val) {
root_index++;
}
TreeNode* root = new TreeNode(root_val);
int left_size = root_index - i_left;
root->left = buildTreeHelper(preorder, inorder, p_left + 1, p_left + left_size, i_left, root_index - 1);
root->right = buildTreeHelper(preorder, inorder, p_left + left_size + 1, p_right, root_index + 1, i_right);
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() {
Solution s;
vector<char> preorder = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
vector<char> inorder = {'D', 'C', 'E', 'B', 'A', 'G', 'F'};
TreeNode* root = s.buildTree(preorder, inorder);
cout << "先序遍历序列为:";
s.preorder(root);
cout << endl;
cout << "中序遍历序列为:";
s.inorder(root);
cout << endl;
cout << "后序遍历序列为:";
s.postorder(root);
cout << endl;
return 0;
}
```
运行结果如下:
```
先序遍历序列为:A B C D E F G
中序遍历序列为:D C E B A G F
后序遍历序列为:D E C B G F A
```
以上代码中,我们首先定义了二叉树的结构体 TreeNode,其中包含节点值和左右子节点的指针。然后,我们定义了一个 Solution 类,其中包含了用于构建二叉树和遍历二叉树的函数。
在 buildTree 函数中,我们使用递归的方式构建二叉树。我们首先在先序遍历序列中找到根节点,然后在中序遍历序列中找到根节点的位置,从而可以确定左右子树的先序和中序遍历序列。然后递归构建左右子树,最终返回根节点。
在 preorder、inorder 和 postorder 函数中,我们分别实现了先序、中序和后序遍历。这些函数都使用递归的方式实现,具体过程可以参考代码。
以上就是创建二叉树的示例代码,希望对你有所帮助!
阅读全文
相关推荐













