- 二叉树类
class binarytree():
def __init__(self,value=None):
self.value=value
self.left=None
self.right=None
self.parent=None
def setright(self,a):
self.right=a
if a!=None:#节点为空,不设此节点的父节点
a.parent=self
def setleft(self,a):
self.left=a
if a!=None:
a.parent=self
def getright(self):
return self.right
def getleft(self):
return self.left
def getvalue(self):
return self.value
def getparent(self):
return self.parent
def __str__(self):
return self.value
2 用列表建立二叉树(递归)
def creat(li):
while len(li)>0:
if li[0]== '#':#空节点
li.pop(0)
return None
else:
t=binarytree(li[0])#中间节点-左子树-右子树
li.pop(0)
t.setleft(creat(li))
t.setright(creat(li))
return t
return t
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#'])
1
2 6
3 4 - -
- - 5 -
3三种便利
def pretraverse(root):#前序遍历,中间节点-左子树-右子树
if root:
print(root.getvalue())
pretraverse(root.getleft())
pretraverse(root.getright())
def inordertraverse(root): #中序遍历,左子数-中间节点-右子树
if root:
inordertraverse(root.getleft())
print(root.getvalue())
inordertraverse(root.getright())
def lasttraverse(root): #后序遍历,左子数-右子树 -中间节点
if root:
lasttraverse(root.getleft())
lasttraverse(root.getright())
print(root.getvalue())
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#']
pretraverse(root)
inordertraverse(root)
lasttraverse(root)
#结果
#1 2 3 4 5 6
#3 2 5 4 1 6
#3 5 4 2 6 1
4递归搜索二叉树
def tracepath(a):#返回某元素和他的父节点以及父节点的父节点。。。
if not a.getparent():
return [a]
else:
return [a]+tracepath(a.getparent())
def dfs(root,a): #深度优先搜素
stack=[root]#根节点放入桟内
while len(stack)>0:
if stack[0].getvalue()==a:
return tracepath(stack[0])#找到,返回路径
else:
temp=stack.pop(0)#当前节点出栈
if temp.getright():
stack.insert(0,temp.getright()) #放到桟的最上面
if temp.getleft():
stack.insert(0,temp.getleft())#放到桟的最上面
return False#
def bfs(root,a): #广度优先搜素
queue=[root]
while len(queue)>0:
if queue[0].getvalue()==a:
return tracepath(queue[0])#找到,返回路径
else:
temp=queue.pop(0)#删除当前节点
if temp.getleft():
queue.append(temp.getleft())#放到队列最后面
if temp.getright():
queue.append(temp.getright())#放到队列最后面
return False
root=creat([1,2,3,'#','#',4,5,'#','#','#',6,'#','#'])
b=dfs(root,3)
print([e.getvalue() for e in b])
b=bfs(root,6)
print([e.getvalue() for e in b])
#输出
#[3, 2, 1]
#[6, 1]