二叉树的深度优先遍历: (可以用递归或者堆栈实现)
- 先序:根节点->左子树->右子树
- 中序: 左子树->根节点->右子树
- 后序:左子树->右子树->根节点
二叉树按广度优先遍历:从上到下,从左到右遍历按层次遍历(利用队列实现)
class Node(object):
"""树的节点类"""
def __init__(self,data=0,leftChild=None,rightChild=None):
self.data=data
self.leftChild=leftChild
self.rightChild=rightChild
def __repr__(self):
return str(self.data)
class Tree(object):
"""无序二叉树的实现类"""
def __init__(self):
self.root=None
def add(self,data):
"""向树中添加一个子节点"""
node = Node(data)
if not self.root:
self.root=node
else:
#树不为空,需要遍历整棵树,找到节点的位置
queue=[self.root]
while queue:
currentNode = queue[0]
#先查找左子树,若左子树为空则加到左节点
if currentNode.leftChild:
queue.append(currentNode.leftChild)
else:
currentNode.leftChild = node
#print("currentNode is:" + str(currentNode.data) + " add [" + str(node.data) + "] to left")
break
#再查找右子树,若右子树为空则添加到右节点
if currentNode.rightChild:
queue.append(currentNode.rightChild)
else:
currentNode.rightChild = node
#print("currentNode is:" + str(currentNode.data) + " add [" + str(node.data) + "] to right")
break
#左右都不为空,将当前元素弹出继续往后遍历查找
queue.pop(0)
def preOrder(self,node,dataList):
"""先序遍历的递归实现: 根节点->左节点->右节点"""
if node==None:
return
else:
dataList.append(node.data)
self.preOrder(node.leftChild,dataList)
self.preOrder(node.rightChild,dataList)
def inOrder(self,node,dataList):
"""中序遍历的递归实现:左节点->根节点->右节点"""
if node == None:
return
else:
self.inOrder(node.leftChild,dataList)
dataList.append(node.data)
self.inOrder(node.rightChild,dataList)
def postOrder(self,node,dataList):
"""后序遍历的递归实现:左节点->右节点->根节点"""
if node == None:
return
else:
self.postOrder(node.leftChild,dataList)
self.postOrder(node.rightChild, dataList)
dataList.append(node.data)
def breadthTravle(self):
"""按广度优先遍历"""
if not self.root:
print("这是一棵空树")
else:
queue =[self.root]
index = 0
while index < len(queue):
currentNode = queue[index]
if currentNode.leftChild:
queue.append(currentNode.leftChild)
if currentNode.rightChild:
queue.append(currentNode.rightChild)
index+=1
#打印节点元素的值
print("按广度优先遍历的结果:" + str(queue))
if __name__=='__main__':
test = Tree()
test.add(0)
test.add(1)
test.add(2)
test.add(3)
test.add(4)
test.add(5)
test.add(6)
test.add(7)
test.add(8)
test.add(9)
test.breadthTravle()
listData = []
test.preOrder(test.root,listData)
print("先序遍历结果:" + str(listData))
listData.clear()
test.inOrder(test.root,listData)
print("中序遍历的结果:" + str(listData))
listData.clear()
test.postOrder(test.root,listData)
print("后序遍历的结果:" + str(listData))