指针二叉树中序先序转后序
时间: 2023-10-13 09:09:16 浏览: 35
指针二叉树的中序遍历顺序是左子树-根节点-右子树,先序遍历顺序是根节点-左子树-右子树,后序遍历顺序是左子树-右子树-根节点。
因此,我们可以通过先序和中序遍历重建二叉树,然后再进行后序遍历输出。
具体实现过程如下:
1. 定义一个函数build_tree(preorder, inorder),用于根据先序和中序遍历构建二叉树。
2. 在build_tree函数中,首先判断preorder和inorder是否为空,如果其中有一个为空,则返回None。
3. 接着,取出preorder的第一个元素作为根节点,创建一个新节点,并将其值赋为根节点的值。
4. 在inorder中找到根节点的位置,则根节点左边的元素是左子树的中序遍历,右边的元素是右子树的中序遍历。
5. 根据左子树的中序遍历长度,在preorder中找到左子树的先序遍历,右边的元素是右子树的先序遍历。
6. 递归调用build_tree函数,分别构建左子树和右子树,并将其作为根节点的左子节点和右子节点。
7. 最后,返回根节点。
8. 定义一个函数postorder_traversal(root),用于后序遍历输出二叉树。
9. 在postorder_traversal函数中,首先判断root是否为空,如果为空,则返回空列表。
10. 递归调用postorder_traversal函数,分别输出左子树、右子树和根节点的值,并将其添加到结果列表中。
11. 最后,返回结果列表。
代码实现如下:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def build_tree(preorder, inorder):
if not preorder or not inorder:
return None
root_val = preorder.pop(0)
root = TreeNode(root_val)
inorder_index = inorder.index(root_val)
root.left = build_tree(preorder, inorder[:inorder_index])
root.right = build_tree(preorder, inorder[inorder_index+1:])
return root
def postorder_traversal(root):
if not root:
return []
left = postorder_traversal(root.left)
right = postorder_traversal(root.right)
return left + right + [root.val]
def inorder_preorder_to_postorder(inorder, preorder):
root = build_tree(preorder, inorder)
return postorder_traversal(root)
```
测试代码:
```python
inorder = [4, 2, 5, 1, 3, 6]
preorder = [1, 2, 4, 5, 3, 6]
postorder = inorder_preorder_to_postorder(inorder, preorder)
print(postorder) # [4, 5, 2, 6, 3, 1]
```
输出结果为:[4, 5, 2, 6, 3, 1],符合预期。