二叉树遍历知多少

Posted Python程序设计

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树遍历知多少相关的知识,希望对你有一定的参考价值。


一直以来,二叉树相关算法问题是研发面试经常被问到的,所以对于程序员来说,尤其是做后端开发的程序员来说必须要掌握的。之前我对于二叉树的应用和算法都比较模糊,直到有次面试被问到如果一层一层去遍历一个二叉树,当时被问的有点懵,回来后恶补了一下二叉树


广度优先


广度优先搜索(Breadth First Search),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,上面二叉树的遍历顺序为:ABCDEFG.

可以利用队列实现广度优先搜索。


我们先看下面的一道题,层次遍历


何为层次遍历

说白了,就是一层一层、由上至下、由左至右的搜索遍历二叉树中的元素。

二叉树遍历知多少

按照上图,输出的顺序是 1,2,3,4,5,6,7,8,9,10

解这道题的思路就是用到了广度(宽度)优先的算法

利用队列,依次将根,左子树,右子树存入队列,按照队列先进先出规则来实现层次遍历。

直接上代码:

def BFS(self,root): #层次遍历核心代码 if root == None: return queue = [] queue.append(root) while queue:            node = queue.pop(0) print(node.data) if node.left != None: queue.append(node.left) if node.right != None:                queue.append(node.right)


利用list 做了一个队列,进行缓存,按照 根节点,左子树,右子树的方式进行存储,弹出,打印

深度优先

上面整体说了一下广度优先的遍历,那么与其相对应的还有深度优先的遍历方式,也是经常被用到

深度优先,简单讲是搜索包括从一条路径的起始点开始追溯,直到到达最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止

还是来看这张图

按照深度优先的输出顺序

A,B,D,E,C,F,G


深度优先遍历即是先按深度来遍历二叉树,包括:

前序遍历
遍历顺序 --> 根节点 -> 左子树 -> 右子树

中序遍历
遍历顺序--> 左子树 -> 根节点 -> 右子树

后序遍历
遍历顺序--> 左子树 -> 右子树 -> 根节点

每种顺序的遍历有轻微的差别

首先,定义 TreeNode:

class TreeNode: def __init__(self, value=None, left=None, right=None): self.value = value self.left = left # 左子树 self.right = right # 右子树

实例化一个 TreeNode:

treeNode = TreeNode("A", TreeNode("B", TreeNode("D"), TreeNode("E") ), TreeNode("C", TreeNode("F"), TreeNode("G") ) )

前序遍历

def preTraverse(root): if root is None: return print(root.value) preTraverse(root.left) preTraverse(root.right)


输出顺序:

A,B,D,E,C,F,G


中序遍历

def midTraverse(root): if root is None: return midTraverse(root.left) print(root.value) midTraverse(root.right)

输出顺序:

D,B,E,A,F,C,G


后序遍历

def afterTraverse(root): if root is None: return afterTraverse(root.left) afterTraverse(root.right) print(root.value)

输出顺序:

D,E,B,F,G,C,A


以上就是二叉树的广度优先遍历和深度优先遍历,在日常开发中,会经常遇到类似的场景应用,熟练掌握二叉树的相关算法也会对开发出高性能的程序提供很多帮助,

这期就介绍到这,下期见


福利:

多多分享,福利多多


关注哦

以上是关于二叉树遍历知多少的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历方式到底有多少种

算法20:求二叉树最宽的层有多少个节点(层序遍历续)

二叉树:我的左下角的值是多少?

二叉树:我有多少个节点?

通过二叉树的中序序列和后序序列获取前序序列

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段