剑指offer实践 ——7.重建二叉树(python版)
题目
二叉树的遍历
先序遍历:按照中->左->右的顺序遍历整棵树。
中序遍历:按照左->中->右的顺序遍历整棵树。
后序遍历:按照左->右->中的顺序遍历整棵树。
例如下图的树:
先序遍历:[1,2,4,7,3,5,6,8]
中序遍历:[4,7,2,1,5,3,8,6]
后序遍历:[7,4,2,5,8,6,3,1]
二叉树的定义
class Binary_Tree():
def __init__(self, root=None, left=None, right=None, parent=None):
self.root = root
self.left = left
self.right = right
题解
def rebuild_btree_pre_in(preorder, inorder):
'''利用先序的第一个是根节点,在中序中划分左右子树后递归'''
b = Binary_Tree()
b.root = preorder[0]
split_index = inorder.index(b.root)
left_tree_inorder = inorder[:split_index]
right_tree_inorder = inorder[split_index+1:]
left_len = len(left_tree_inorder)
left_pre = preorder[1:left_len+1]
right_pre = preorder[left_len+1:]
if left_pre and left_tree_inorder:
b.left = rebuild_btree_pre_in(left_pre, left_tree_inorder)
if right_pre and right_tree_inorder:
b.right = rebuild_btree_pre_in(right_pre, right_tree_inorder)
return b
拓展
重建二叉树:中序后序
def rebuild_btree_in_post(inorder, postorder):
b = Binary_Tree()
b.root = postorder[-1]
index = inorder.index(b.root)
left_tree_in = inorder[:index]
right_tree_in = inorder[index+1:]
left_len = len(left_tree_in)
left_tree_post = postorder[:left_len]
right_tree_post = postorder[left_len:-1]
if left_tree_in and left_tree_post:
b.left = rebuild_btree_in_post(left_tree_in, left_tree_post)
if right_tree_in and right_tree_post:
b.right = rebuild_btree_in_post(right_tree_in, right_tree_post)
return b
重建二叉树:先序后序,不能唯一确定一棵树,统计不同的树形等待后序更新哈~