python实现二叉树的相关算法(持续更新)
2018-03-04 21:03
866 查看
定义树结构
前序遍历
中序遍历
后序遍历
代码虽简单,但是个人认为树结构是学习递归,乃至学习函数式编程的好例子.宜细细品味,挖个函数式编程的坑,希望以后自己可以写出一篇完整的文章.
根据先序遍历和中序遍历,重建二叉树 牛客网-剑指offer 重建二叉树
二叉树的深度优先遍历(DFS)
二叉树的广度优先遍历(BFS)
在迭代实现遍历时,深度优先以栈结构实现,广度优先以队列结构实现.
附:二叉树的深度优先遍历递归实现
实际上树的前序后序中序遍历都是深度优先的具体情况,以上面前序遍历的代码即可作为树的深度优先遍历的递归实现.
二叉树的镜像(对称反转一个二叉树)
二叉树的深度
检验两棵树是否相同(LeetCode:SameTree)
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 快速排序 堆排序——Python实现一些算法持续更新
- 一些二叉树相关算法Python的解决
- adaboost 算法在实现中的一些问题以及解决方法(持续更新)
- iOS 二叉树相关算法实现
- 常用距离算法和相关系数及其Python实现
- Python 实现二叉树相关操作
- 二叉树相关算法实现-iOS
- python实现的二叉树定义与遍历算法实例
- 《面试》---Python 实现二叉树结构以及相关遍历
- [置顶] 算法思想汇总(java实现)【持续更新中】
- 用链表实现“啦啦啦”等算法或数据结构(持续更新)
- 查找""排序""简单数学计算" "简单算法"[Java实现](数据结构和算法)(复习)(持续更新
- (二叉树相关算法实现-iOS)
- JavaScript:利用JavaScript实现的功能、算法和奇淫技巧(持续更新)
- 常见算法的java实现代码(持续更新中)
- (二叉树)谈一谈各类算法和数据结构的c++实现以及相关操作的复杂度(二)
- Python相关工具清单[持续更新]
- 二叉树-你必须要懂!(二叉树相关算法实现-iOS)
- 二叉树-你必须要懂!(二叉树相关算法实现-iOS)
- [剑指offer]之python实现总结[持续更新中]