本程序包括2个部分:
1,剑指offer第7题:重建二叉树
给定一个前序与中序遍历序列,重新构建二叉树,并且输出它根节点
2,剑指offer第8题:二叉树的下一个节点
给定一个树所有节点的父节点,左右节点,找出指定节点的在中序遍历序列中的下一个节点
class TreeNode:
"""
建立二叉树节点的属性
"""
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.parent = None

class Solution:
def reconstruct_tree(self, pre, mid, parent=None):
"""
重建二叉树
前序遍历序列确定一个根节点,中序遍历确定左右子树,采用迭代
"""
if len(pre) == 0:
return None
else:
res = TreeNode(pre[0])
res.parent = parent
res.left = self.reconstruct_tree(pre[1: mid.index(pre[0]) + 1],
mid[: mid.index(pre[0])],res)
res.right = self.reconstruct_tree(pre[mid.index(pre[0]) + 1: ],
mid[mid.index(pre[0]) + 1:],res)
return res
def get_next_node(self, node):
"""
获取下一个节点
"""
if not node:
return None
if node.right:
node = node.right
while node.left:
node = node.left
return node
elif node.parent:
while node.parent and node.parent.right == node:
node = node.parent
return node.parent
return None
def print_node(node):
"""
这个函数可以不要,只是为了输出所有节点的父节点,左右节点
"""
print 'value:', node.val
if node.parent:
print 'The parent node value', node.parent.val,
if node.left:
print 'The left_node:', node.left.val,
if node.right:
print 'The right_node:', node.right.val,
print '\n--------------------------------'
if node.left:
print_node(node.left)
if node.right:
print_node(node.right)
return None
def post_lst(node, state=()):
"""
输入根节点,输出后序遍历
"""
if node.left:
state = post_lst(node.left, state)
if node.right:
state = post_lst(node.right, state)
state = state+(node.val,)
return state
def find_node(node, val):
"""
这个函数功能:
输入某个数字,会返回这是数字的对应的节点
只是为了方便做“下一个节点”的测试
"""
if node.val == val:
return node
else:
if node.left:
snode = find_node(node.left, val)
if snode:
return snode
if node.right:
snode = find_node(node.right, val)
if snode:
return snode
return None
测试用例:
pre = [1,2,4,7,3,5,6,8]
mid = [4,7,2,1,5,3,8,6]
solution = Solution()
node = solution.reconstruct_tree(pre,mid)
print post_lst(node)
snode = find_node(node,7)
next_node = solution.get_next_node(snode)
if next_node:
print next_node.val