二叉树应用场景很多,比如:数据检索,数据管理
二叉树的遍历,分为深度优先遍历,以及广度优先遍历。在深度优先遍历中,具体分为如下三种:
- 先序遍历:先访问根节点,再遍历左子树,再遍历右子树;
- 中序遍历:先遍历左子树,再访问根节点,再遍历右子树;
- 后序遍历:先遍历左子树,再遍历右子树,再访问根节点
对于上图的二叉树,其先序遍历结果是:50,20,15,30,60,70;其中序遍历结果是:15,20,30,50,60,70;其后序遍历结果是:15,30,20,70,60,50
# encoding=utf-8
class TreeNode(object):
def __init__(self,var,left=None,right=None):
self.var = var
self.left = left
self.right = right
class BinaryTree(object):
def __init__(self,root=None):
self.root = root
def preOrder(self,retList,node='root'):
if node == 'root':
node = self.root
if node != None:
retList.append(node)
print ([i.var for i in retList])
self.preOrder(retList,node.left)
self.preOrder(retList,node.right)
return retList
def inOrder(self,retList,node='root'):
if node == 'root':
node = self.root
if node != None:
self.inOrder(retList,node.left)
retList.append(node)
print ([i.var for i in retList])
self.inOrder(retList,node.right)
return retList
def postOrder(self,retList,node='root'):
if node == 'root':
node = self.root
if node != None:
self.postOrder(retList,node.left)
self.postOrder(retList,node.right)
retList.append(node)
print ([i.var for i in retList])
return retList
if __name__ == '__main__':
rootNode = TreeNode(50)
rootNode.left = TreeNode(20,left=TreeNode(15),right=TreeNode(30))
rootNode.right = TreeNode(60,right=TreeNode(70))
binaryTree = BinaryTree(rootNode)
ret = binaryTree.preOrder([],binaryTree.root)
for i in ret:
print (i.var,end=" ")
print("")
ret = binaryTree.inOrder([],binaryTree.root)
for i in ret:
print (i.var,end=" ")
print("")
ret = binaryTree.postOrder([],binaryTree.root)
for i in ret:
print (i.var,end=" ")
执行结果:
先序遍历执行结果:
中序遍历执行结果:
后序遍历执行结果: