1、题目描述:二叉树的构建、深度遍历(6种)、层次遍历
# -*- coding: utf-8 -*- """ Created on Tue Jun 19 10:31:40 2018 @author: Administrator """ class Node(): def __init__(self,elem=-1,lchild=None,rchild=None): self._elem=elem self._lchild=lchild self._rchild=rchild class BinaryTree(): def __init__(self): self._root=Node() self._myQueue=[] def add(self,elem):#为树添加节点 node=Node(elem) if self._root._elem==-1:#如果树是空的,则对根节点赋值 self._root=node self._myQueue.append(self._root) else: treeNode=self._myQueue[0] if treeNode._lchild==None: treeNode._lchild=node self._myQueue.append(treeNode._lchild) else: treeNode._rchild=node self._myQueue.append(treeNode._rchild) self._myQueue.pop(0)#用于叶节点的子节点增加(层次) def front_digui(self,root):#先序递归 if root==None: return print (root._elem) self.front_digui(root._lchild) self.front_digui(root._rchild) def middle_digui(self,root):#中序递归 if root==None: return self.middle_digui(root._lchild) print(root._elem) self.middle_digui(root._rchild) def later_digui(self,root):#后序递归 if root==None: return self.later_digui(root._lchild) self.later_digui(root._rchild) print(root._elem) def front_stack(self,root):#先序非递归(堆栈) #第一次经过,压栈,访问,取其左 #第二次经过,出栈,取其右 if root==None: return myStack=[] node=root while node or myStack: while node: myStack.append(node) print (node._elem) node=node._lchild node=myStack.pop() node=node._rchild def middle_stack(self,root):#中序非递归(堆栈) #第一次经过,压栈,取其左 #第二次经过,出栈,访问,取其右 if root==None: return myStack=[] node=root while node or myStack: while node: myStack.append(node) node=node._lchild node=myStack.pop() print (node._elem) node=node._rchild def later_stack(self,root):#后序非递归(两个堆栈) if root==None: return myStack1=[] myStack2=[] node=root myStack1.append(node) while myStack1:#这个while循环的功能是找出后序遍历的逆序,存在myStack2里面 node=myStack1.pop()#这个列表相当于栈 if node._lchild: myStack1.append(node._lchild) if node._rchild: myStack1.append(node._rchild) myStack2.append(node) while myStack2:#将myStack2中的元素出栈,即为后序遍历次序 print (myStack2.pop()._elem) def level_queue(self,root):#层次遍历 result=[] if root==None: return result myQueue=[] node=root myQueue.append(node) while myQueue: node=myQueue.pop(0)#这个列表相当于队列 #print (node._elem) result.append(node._elem) if node._lchild: myQueue.append(node._lchild) if node._rchild: myQueue.append(node._rchild) return result tree=BinaryTree() for i in range(5): tree.add(i) #tree.front_digui(tree._root) #tree.middle_digui(tree._root) #tree.later_digui(tree._root) #tree.front_stack(tree._root) #tree.middle_stack(tree._root) #tree.later_stack(tree._root) a=tree.level_queue(tree._root) print (a)3、总结:深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。