建树
class treeNode(object):
def __init__(self, value = None,left = None,right=None):
self.value, self.left, self.right,self.key= value, left, right, 0#0用来表示访问左子树,1表示访问左子树
class Tree(object):
def __init__(self, root = None,count = None,maxsize =None):
self.root ,self.count,self.maxsize ,self.flag= root ,count,maxsize,0#此时的0表示
#头结点还未访问到。
def build_tree(self, list):
stack = []#以列表的形式来表示一个栈
if len(list)==0 or list[0] =='#':
return
while len(list)>0 :#当链表不为空时,即还有结点没有处理
if self.flag == 0:
node = treeNode(list[0])
self.flag = 1
self.root = node
stack.append(node)#将头结点加入到栈空间中
else:
char = list[0]
if char == '#':#符号为#表示该节点为空
node = stack[-1]#取栈顶结点
if node.key == 0:
node.left = None
node.key+=1#该节点已经访问过了左子树
else:
node.right = None
stack.pop()#该节点的两个结点已经访问过了江结点抛出去即可。
else:
node = stack[-1]#取得栈顶元素
new_node = treeNode(char)
if node.key == 0:
node.left = new_node
node.key+=1
stack.append(new_node)
else:
node.right = new_node
stack.pop()#该节点访问完了将该节点
stack.append(node.right)#将该新节点加入到栈中(注意好先后顺序)
list.pop(0)#抛出第一个元素
def Inrorder(self,root):#中序遍历
if root.left is not None:
self.pirorder(root.left)
print(root.value)
if root.right is not None:
self.pirorder(root.right)
def text_pt():
tree = Tree()
string = ['A','B','C','#','#','D','E','#','G','#','#','F','#','#','#']
tree.build_tree(string)
tree.pirorder(tree.root)
text_pt()
层序遍历:
class treeNode(object):
def __init__(self, value=None, left=None, right=None):
self.value, self.left, self.right, self.key = value, left, right, 0
class Tree(object):
def __init__(self, root=None, count=None, maxsize=None):
self.root, self.count, self.maxsize, self.flag = root, count, maxsize, 0
def build_tree(self, list):
queue = []
while True:
if len(list) == 0:
return
if self.flag == 0:#申请头结点
node = treeNode(list[0])
self.root = node
queue.append(node)
list.pop(0)
self.flag =1
else:
node = queue[0]
char = list[0]
if node.left is None:
if char == '#':
node.left = None
list.pop(0)
else:
node.left = treeNode(char)
queue.append(node.left)
list.pop(0)
char = list[0]
if node.right is None:
if char == '#':
node.right = None
list.pop(0)
queue.pop(0)
else:
node.right = treeNode(char)
queue.append(node.right)
queue.pop(0)
list.pop(0)
def pirorder(self, root):
if root.left is not None:
self.pirorder(root.left)
print(root.value)
if root.right is not None:
self.pirorder(root.right)
def text_pt():
tree = Tree()
string = ['A', 'B', 'C', '#', '#', '#', '#']
tree.build_tree(string)
tree.pirorder(tree.root)
text_pt()
堆栈实现先序遍历
def front_queueAndStack(self, root):
if root == None:
return
stack = []
node = root
while root or stack:
while node:
print node.value
stack.append(node)
node = node.lchild
node = stack.pop()
node = node.rchild
堆栈实现中序遍历
def middle_queueAndStack(self, root);
if root == None:
return
node = root
stack = []
while stack or node:
while node:
stack.append(node)
node = node.lchild
node = stack.pop()#该节点不存在左结点, 该节点出栈,查找右结点
print(node.data)
node = node.rchild()
堆栈实现后序遍历
def behand_queueAndStack(self,root):
if root = None:
return
stack_1 = []
stack_2 = []
node = root
stack_1.append(node)
while stack_1:
node = stack_1.pop()
if node.lchild:
stack_1.append(node.lchild)
if node.rchild:
stack_2.append(node.rchild)
stack_2.append(node)
while stack_2:
print(stack_2.pop().data)
层次遍历
def level_queue(self, root):
if root == None:
return
queue = []
while queue:
node = queue.pop(0)
print(node.value)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)