二叉树深度优先和广度优先遍历
来源:互联网 发布:赵丽颖电影知乎 编辑:程序博客网 时间:2024/05/16 12:40
二叉树遍历
树的遍历是树的一种重要的运算。所谓遍历是指对树中所有结点的信息的访问,即依次对树中每个结点访问一次且仅访问一次,我们把这种对所有节点的访问称为遍历(traversal)。那么树的两种重要的遍历模式是深度优先遍历和广度优先遍历,深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。
深度优先遍历
对于一颗二叉树,深度优先搜索(Depth First Search)是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。
那么深度遍历有重要的三种方法。这三种方式常被用于访问树的节点,它们之间的不同在于访问每个节点的次序不同。这三种遍历分别叫做先序遍历(preorder),中序遍历(inorder)和后序遍历(postorder)。我们来给出它们的详细定义,然后举例看看它们的应用。
先序遍历
在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
根节点->左子树->右子树
def preorder(self, root): """递归实现先序遍历""" if root == None: return print(root.elem) self.preorder(root.lchild) self.preorder(root.rchild)
中序遍历
在中序遍历中,我们递归使用中序遍历访问左子树,然后访问根节点,最后再递归使用中序遍历访问右子树
左子树->根节点->右子树
def inorder(self, root): """递归实现中序遍历""" if root == None: return self.inorder(root.lchild) print(root.elem) self.inorder(root.rchild)
后序遍历
在后序遍历中,我们先递归使用后序遍历访问左子树和右子树,最后访问根节点
左子树->右子树->根节点
def postorder(self, root): """递归实现后续遍历""" if root == None: return self.postorder(root.lchild) self.postorder(root.rchild) print(root.elem)
广度优先遍历(层次遍历)
从树的root开始,从上到下从从左到右遍历整个树的节点
def breadth_travel(self): """广度优先遍历""" if self.root is None: return else: queue = [] queue.append(self.root) while len(queue) > 0: node = queue.pop(0) print(node.item, end=" ") if node.lchild: queue.append(node.lchild) if node.rchild: queue.append(node.rchild)
完整代码
class Node(object): """节点""" def __init__(self, item): self.item = item self.lchild = None self.rchild = Noneclass BinaryTree(object): """二叉树""" def __init__(self, node=None): self.root = node def add(self, item): """""" if self.root is None: self.root = Node(item) else: queue = [] queue.append(self.root) while len(queue) > 0: node = queue.pop(0) if not node.lchild: node.lchild = Node(item) return else: queue.append(node.lchild) if not node.rchild: node.rchild = Node(item) return else: queue.append(node.rchild) def breadth_travel(self): """广度优先遍历""" if self.root is None: return else: queue = [] queue.append(self.root) while len(queue) > 0: node = queue.pop(0) print(node.item, end=" ") if node.lchild: queue.append(node.lchild) if node.rchild: queue.append(node.rchild) def preorder_travel(self, node): """根 左 右""" if node: print(node.item, end=" ") self.preorder_travel(node.lchild) self.preorder_travel(node.rchild) else: return def inorder_travel(self, node): """左 根 右""" if node: self.inorder_travel(node.lchild) print(node.item, end=" ") self.inorder_travel(node.rchild) else: return def postorder_travel(self, node): """左 右 根""" if node: self.postorder_travel(node.lchild) self.postorder_travel(node.rchild) print(node.item, end=" ") else: return#测试if __name__ == '__main__': t = BinaryTree() t.add(0) t.add(1) t.add(2) t.add(3) t.add(4) t.add(5) t.add(6) t.add(7) t.add(8) t.add(9) t.breadth_travel() print("") t.preorder_travel(t.root) print("") t.inorder_travel(t.root) print("") t.postorder_travel(t.root) print("")
阅读全文
0 0
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的广度优先遍历和深度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 二叉树的深度优先遍历和广度优先遍历
- 括号匹配 (简易版) 栈
- ajax实例
- hadoop中集群提交任务运行
- Rxjava
- Unity顶点着色器和片段着色器
- 二叉树深度优先和广度优先遍历
- java类的引用使用即String类的toUpperCase的使用
- U-Boot源代码阅读笔记(二) —— 对lowlevel_init.S的分析
- [codevs]: 线段树练习1-4
- Mybatis5.0.2分页插件
- bmob和okgo的冲突
- javaoop总结
- python3_字典
- hibernate-关系映射(一对一(单向、双向))-8