您的位置:首页 > 编程语言 > Python开发

python实现二叉树的相关算法(持续更新)

2018-03-04 21:03 866 查看
定义树结构

class Tree(object):
def __init__(self,val):
self.val = val
self.right = None
self.left = None


前序遍历

def pre_iter(node):
if not node:
return
print(node.val)
pre_iter(node.left)
pre_iter(node.right)


中序遍历

def mid_iter(node):
if not node:
return
mid_iter(node.left)
print(node.val)
mid_iter(node.right)


后序遍历

def post_iter(node):
if not node:
return
post_iter(node.left)
post_iter(node.right)
print(node.val)


代码虽简单,但是个人认为树结构是学习递归,乃至学习函数式编程的好例子.宜细细品味,挖个函数式编程的坑,希望以后自己可以写出一篇完整的文章.

根据先序遍历和中序遍历,重建二叉树 牛客网-剑指offer 重建二叉树

class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if len(tin) == 0:
return None
else:
#先序序列当中第一个值必定为该层父节点
root = TreeNode(pre[0])
#root已经包含了返回的节点值
slt = tin.index(pre[0])
root.left = self.reConstructBinaryTree(pre[1:1+slt],tin[:slt])
root.right = self.reConstructBinaryTree(pre[1+slt:],tin[slt+1:])
return root


二叉树的深度优先遍历(DFS)

def dfs(self, root):
stk = []#以栈结构实现
if not root:
return root
else:
stk.append(root)
while stk:
node = stk.pop()
print(node.val)#这里可执行一切使用当前结点的方法
#右子结点先入栈
if node.right:
stk.append(node.right)
#左子结点后入栈
if node.left:
stk.append(node.left)


二叉树的广度优先遍历(BFS)

def bfs(self, root):
q = []#以队列结构实现
if not root:
return root
else:
q.append(root)
while q:
#以list结构实现栈与队列结构知识pop()与pop(0)的区别
node = q.pop(0)
print(node.val)#这里可执行一切使用当前结点的方法
#左子结点先入栈
if node.left:
q.append(node.left)
#右子结点后入栈
if node.right:
q.append(node.right)


在迭代实现遍历时,深度优先以栈结构实现,广度优先以队列结构实现.

附:二叉树的深度优先遍历递归实现

实际上树的前序后序中序遍历都是深度优先的具体情况,以上面前序遍历的代码即可作为树的深度优先遍历的递归实现.

def dfs_rcv(node):
if not node:
return
print(node.val)
dfs_rcv(node.left)
dfs_rcv(node.right)


二叉树的镜像(对称反转一个二叉树)

def Mirror(root):
if not root:
return
else:
root.left, root.right = Mirror(root.right), Mirror(root.left)
#错误写法
#root.left = Mirror(root.right)
#root.right = Mirror(root.left)
return root


二叉树的深度

def depth(root):
if not root:
return 0
else:
nleft = depth(root.left)
nright = depth(root.right)
return max(nleft, nright) + 1


检验两棵树是否相同(LeetCode:SameTree)

if not p and not q:
return True
else:
if not p or not q:
return False
else:
return (p.val == q.val) and self.isSameTree(p.left,q.left) and self.isSameTree(p.right,q.right)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据结构 算法