遍历二叉树:
概念: 树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。
如图:
深度优先遍历
在深度优先遍历中,又分为:“层级遍历”,“先序遍历”,“中序遍历”,“后序遍历”。
层级遍历 :我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树。
------ 根节点->左子树->右子树。
def breadth_travel(self):
"""利用队列实现树的层次遍历"""
if root == None:
return
queue = []
queue.append(root)
while queue:
node = queue.pop(0)
print node.elem,
if node.lchild != None:
queue.append(node.lchild)
if node.rchild != None:
queue.append(node.rchild)
因此遍历结果为:0,1,2,3,4,5,6,7,8,9。
先序遍历:我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树。
------ 根节点->左子树->右子树
def preorder(self, root):
"""递归实现先序遍历"""
if root == None:
return
print root.elem
self.preorder(root.lchild)
self.preorder(root.rchild)
因此遍历结果为:0,1,3,7,8,4,9,2,5,6。
中序遍历:我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树。
------ 左子树->根节点->右子树
def inorder(self, root):
"""递归实现中序遍历"""
if root == None:
return
self.inorder(root.lchild)
print root.elem
self.inorder(root.rchild)
因此遍历结果为:7,3,8,1,9,4,0,5,2,6。
后序遍历:我们先递归使用后序遍历访问左子树和右子树,最后访问根节点。
------ 左子树->右子树->根节点
def postorder(self, root):
"""递归实现后续遍历"""
if root == None:
return
self.postorder(root.lchild)
self.postorder(root.rchild)
print root.elem
因此遍历结果为:7,8,3,9,4,1,5,6,2,0。
广度优先遍历
广度优先遍历其实就是层级遍历:
遍历顺序就是,从上到下、从左到右。依次遍历,代码见 深度优先-层级遍历