08581: 扩展二叉树
tree, dfs, http://cs101.openjudge.cn/practice/08581/
由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。 现给出扩展二叉树的先序序列,要求输出其中序和后序序列。

输入
扩展二叉树的先序序列(全部都由大写字母或者.组成)
输出
第一行:中序序列 第二行:后序序列
样例输入
ABD..EF..G..C..样例输出
DBFEGAC
DFGEBCA通过递归方法解析扩展二叉树的先序序列,并输出其中序和后序序列:
python
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def build_tree(s, index):
# 如果当前字符为'.',表示空结点,返回None,并将索引后移一位
if s[index] == '.':
return None, index + 1
# 否则创建一个结点
node = Node(s[index])
index += 1
# 递归构造左子树
node.left, index = build_tree(s, index)
# 递归构造右子树
node.right, index = build_tree(s, index)
return node, index
def inorder(node, res):
if node is None:
return
inorder(node.left, res)
res.append(node.val)
inorder(node.right, res)
def postorder(node, res):
if node is None:
return
postorder(node.left, res)
postorder(node.right, res)
res.append(node.val)
def main():
s = input().strip()
root, _ = build_tree(s, 0)
in_res = []
inorder(root, in_res)
post_res = []
postorder(root, post_res)
print("".join(in_res))
print("".join(post_res))
if __name__ == '__main__':
main()代码说明
build_tree 函数
递归地根据扩展二叉树的先序序列构造二叉树:- 当遇到
'.'时表示空结点,直接返回None。 - 否则以当前字符创建一个结点,然后递归构造其左子树和右子树。
- 当遇到
inorder 和 postorder 函数
分别实现中序遍历(左-根-右)和后序遍历(左-右-根)。main 函数
读取输入字符串,构造树后计算中序和后序遍历结果,并输出。
由于二叉树的空结点都用.补齐了,直接进行递归就可以得到唯一确定的树。
python
class BinaryTreeNode:
def __init__(self, value):
self.value = value
self.left = None
self.right = None
def build_tree(lst):
if not lst:
return None
value = lst.pop()
if value == '.':
return None
root = BinaryTreeNode(value)
root.left = build_tree(lst)
root.right = build_tree(lst)
return root
def inorder(root):
if not root:
return []
left = inorder(root.left)
right = inorder(root.right)
return left + [root.value] + right
def postorder(root):
if not root:
return []
left = postorder(root.left)
right = postorder(root.right)
return left + right + [root.value]
lst = list(input())
root = build_tree(lst[::-1])
in_order_result = inorder(root)
post_order_result = postorder(root)
print(''.join(in_order_result))
print(''.join(post_order_result))嵌套括号表示法Nested parentheses representation。直接用元组(root, left, right)来代表一棵树。
ABD..EF..G..C.. ('A', ('B', ('D', None, None), ('E', ('F', None, None), ('G', None, None))), ('C', None, None))
python
def build_tree(preorder):
if not preorder or preorder[0] == '.':
return None, preorder[1:]
root = preorder[0]
left, preorder = build_tree(preorder[1:])
right, preorder = build_tree(preorder)
return (root, left, right), preorder
def inorder(tree):
if tree is None:
return ''
root, left, right = tree
return inorder(left) + root + inorder(right)
def postorder(tree):
if tree is None:
return ''
root, left, right = tree
return postorder(left) + postorder(right) + root
# 输入处理
preorder = input().strip()
# 构建扩展二叉树
tree, _ = build_tree(preorder)
# 输出结果
print(inorder(tree))
print(postorder(tree))递归建树,节点满载了就pop出去,最后递归得到答案
python
#杨天健 信息科学技术学院
class Node:
def __init__(self,data):
self.data=data
self.left=None
self.right=None
def mid(root):
return ("" if root.left==None else mid(root.left))+(""if root.data=='.'else root.data)+(""if root.right==None else mid(root.right))
def post(root):
return ("" if root.left==None else post(root.left))+(""if root.right==None else post(root.right))+(""if root.data=='.'else root.data)
s=input()
root=Node(s[0])
stack=[root]
for i in range(1,len(s)):
a=Node(s[i])
if stack[-1].left==None :
stack[-1].left=a
if a.data!='.':
stack.append(a)
else :
stack[-1].right=a
stack.pop()
if s[i]!='.':
stack.append(a)
print(mid(root))
print(post(root))
#ABD..EF..G..C..