参考:https://www.cnblogs.com/freeman818/p/7252041.html
https://blog.youkuaiyun.com/sqiu_11/article/details/77657840
二叉树的遍历
二叉树的遍历是指访问所有节点且仅访问一次,按照根节点位置的不同分为前序遍历(根节点在前面),中序遍历(根节点在中间),和后序遍历(根节点在后面)。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
例如:对于如下树
前序遍历:12473568
中序遍历:47215386
后序遍历:74258631
二叉树的三种遍历的递归实现
# -*- coding:utf-8 -*-
class Node:
def __init__(self, val = None, left = None, right = None):
self.val = val;
self.left = left
self.right = right
def preTraverse(self, root):
if root==None:
return
print(root.val)
self.preTraverse(root.left)
self.preTraverse(root.right)
def midTraverse(self, root):
if root==None:
return
self.midTraverse(root.left)
print(root.val)
self.midTraverse(root.right)
def afterTraverse(self, root):
if root==None:
return
self.afterTraverse(root.left)
self.afterTraverse(root.right)
print(root.val)
if __name__=='__main__':
root = Node('1', Node('2', Node('4', right=Node('7'))), Node('3', Node('5'),Node('6',Node('8'))))
print('前序遍历')
root.preTraverse(root)
print('\n')
print('中序遍历')
root.midTraverse(root)
print('\n')
print('后序遍历')
root.afterTraverse(root)
print('\n')
结果如下:
二叉树的重建
那么,如果我们已知二叉树的前序遍历和中序遍历,我们可以重建二叉树(剑指offer第6题)
思路:利用二叉树前序遍历和中序遍历的特性。前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点左侧的均为根的左子树,这个点右侧的均为根的右子树。这时可以利用递归,分别取前序遍历[1:n+1]和中序遍历的[:n]对应与左子树继续上一个过程,取前序遍历[n+1:]和中序遍历[n+1:]对应于右子树继续上一个过程,最终得以重建二叉树。
# -*- coding:utf-8 -*-
class TreeNode(object):
''''节点类'''
def __init__(self, x=-1):
self.val = x
self.left = None
self.right = None
def preTraverse(self, root):
if root==None:
return
print(root.val)
self.preTraverse(root.left)
self.preTraverse(root.right)
def midTraverse(self, root):
if root==None:
return
self.midTraverse(root.left)
print(root.val)
self.midTraverse(root.right)
def afterTraverse(self, root):
if root==None:
return
self.afterTraverse(root.left)
self.afterTraverse(root.right)
print(root.val)
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if not pre or not tin:
return None
root = TreeNode(pre[0])
n = tin.index(pre[0])
root.left = self.reConstructBinaryTree(pre[1:n+1], tin[:n])
root.right = self.reConstructBinaryTree(pre[n+1:], tin[n+1:])
return root
# test
pre = list('12473568')
tin = list('47215386')
sol = Solution()
newTree = sol.reConstructBinaryTree(pre, tin)
print('前序遍历')
newTree.preTraverse(newTree)
print('中序遍历')
newTree.midTraverse(newTree)
print('后序遍历')
newTree.afterTraverse(newTree)
得到的结果依然和上面的一样,说明我们成功的重建了二叉树。