给定一个字符序列,请按照先序遍历的顺序构建对应的二叉树,其中‘#’表示空。然后输出二叉树的后序遍历序列 输入格式: 一个正整数N(N<1000),N个字符序列。 输出格式: N个字符序列(第i个字符序列为输入的第i个字符序列构建的二叉树的后序遍历序列)
时间: 2024-05-06 22:18:06 浏览: 12
以下是 Python3 代码实现:
```python
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def buildTree(preorder):
stack = []
root = None
for val in preorder:
if val != '#':
node = TreeNode(val)
if not root:
root = node
if stack:
parent = stack[-1]
if not parent.left:
parent.left = node
else:
parent.right = node
stack.append(node)
else:
if stack:
stack.pop()
return root
def postorderTraversal(root):
if not root:
return []
res = []
stack = [root]
while stack:
node = stack.pop()
res.append(node.val)
if node.left:
stack.append(node.left)
if node.right:
stack.append(node.right)
return res[::-1]
n = int(input())
for i in range(n):
preorder = input().split()
root = buildTree(preorder)
postorder = postorderTraversal(root)
print(' '.join(postorder))
```
思路解析:
首先,我们需要根据先序遍历的顺序构建对应的二叉树。我们可以使用一个栈来辅助完成这个过程。遍历先序序列,如果当前字符不是‘#’,则创建一个节点,并将节点加入到栈中。如果当前栈不为空,则将栈顶元素作为父节点,判断其左子树是否为空,如果为空,则将当前节点作为其左子树,否则将其作为其右子树。如果当前字符为‘#’,则将栈顶元素弹出。
接着,我们需要输出二叉树的后序遍历序列。我们可以使用迭代的方式来完成这个过程。我们可以使用一个栈来存储节点。首先将根节点加入到栈中,然后进入循环,如果栈不为空,则弹出栈顶元素,将其值加入到结果列表中。然后判断其右子树是否存在,如果存在,则将其右子树加入到栈中。接着判断其左子树是否存在,如果存在,则将其左子树加入到栈中。最后将结果列表反转即可。