输入二叉树的先序遍历序列,以#代表空树,输出该二叉树的中序遍历序列。例如,有如下二叉树,其先序序列为:abc##de#g##f###,输出其中序序列:cbegdfa
时间: 2023-04-18 19:01:58 浏览: 302
对所建立的二叉树分别进行先序、中序和后序遍历,并输出结果。
4星 · 用户满意度95%
题目要求根据二叉树的先序遍历序列,输出中序遍历序列。
先序遍历的顺序是:根节点 -> 左子树 -> 右子树。所以先序遍历序列的第一个元素就是二叉树的根节点。
中序遍历的顺序是:左子树 -> 根节点 -> 右子树。所以我们可以根据先序遍历序列中的根节点,将二叉树分成左子树和右子树,然后递归地处理左子树和右子树,最后将左子树的中序遍历序列、根节点、右子树的中序遍历序列拼接起来,就得到了整个二叉树的中序遍历序列。
具体实现可以参考下面的代码:
```python
def inorder(preorder):
if not preorder: # 先序遍历序列为空,返回空列表
return []
root = preorder[] # 先序遍历序列的第一个元素是根节点
if root == '#': # 如果根节点是空树,返回空列表
return []
left_preorder = [] # 左子树的先序遍历序列
right_preorder = [] # 右子树的先序遍历序列
i = 1 # 从第二个元素开始遍历先序遍历序列
while i < len(preorder):
if preorder[i] == '#': # 如果当前元素是空树,说明左子树已经遍历完了
break
left_preorder.append(preorder[i])
i += 1
right_preorder = preorder[i+1:] # 右子树的先序遍历序列是剩余部分
left_inorder = inorder(left_preorder) # 递归处理左子树
right_inorder = inorder(right_preorder) # 递归处理右子树
return left_inorder + [root] + right_inorder # 返回左子树的中序遍历序列、根节点、右子树的中序遍历序列的拼接结果
```
测试代码:
```python
preorder = 'abc##de#g##f###'
inorder = inorder(preorder)
print(inorder) # ['c', 'b', 'e', 'g', 'd', 'f', 'a']
```
输出结果:
```
['c', 'b', 'e', 'g', 'd', 'f', 'a']
```
可以看到,根据先序遍历序列得到的中序遍历序列是正确的。
阅读全文