chpa02_用分治法构造二叉树
算法思路:
1. 给出先序,中序序列(两个序列中的值不应该有重复)
2. 先序序列的第一个符号就是树的根
3. 根据先序序列中根的值在中序序列中找到根所在节点的下标
4. 根据下标将先序序列和中序序列分别都分解成两个子序列(这里要注意分解的方式,下面的实现中用了值传递的方式)
5. 根据上面分得的子序列分别用递归的方式构造左右子树(这里就包含了分治的思想)
算法实现(Python):
# encoding:utf-8
'''
python 3.3 Created on 2012-6-8 ''' #=============================================================================== # 树的节点 #=============================================================================== class Node: def __init__(self): self.data = None self.left = None self.right = None #=============================================================================== #给定数的两个序列,一个先序序列,一个中序序列 #用分治的方法构造一棵树 #=============================================================================== def CreateTree(pre, mid): root = Node() l = len(pre) if l == 0: root = None return root if l == 1: root.data = pre[0] root.left = None root.right = None return root if l > 1: i = mid.index(pre[0]) root.data = pre[0] root.left = CreateTree(pre[1:i+1], mid[0:i]) root.right = CreateTree(pre[i+1:l], mid[i+1:l]) return root #=============================================================================== # 后序遍历二叉树 #=============================================================================== def Treversal(root): if root is not None: Treversal(root.left) Treversal(root.right) print(root.data, end="") preStr = "ABHDGCEF" # 先序序列 midStr = "HBGDAECF" # 中序序列 aftStr = "HGDBEFCA" # 后序序列 root = CreateTree(preStr, midStr) Treversal(root) # 用于验证是否正确