我们知道,构成算法的基础数据结构,无非两种,数组和链表。至于特点嘛,数组的特点就是支持下标随机访问,而链表则支持快速删除和插入,在某种程度上形成了互补,当然了,这两者都是属于一维空间。
树这种结构,如其名,有分叉。构成分叉需要两个元素,父节点,以及多个分支,也就是子节点,或者说叶子结点。空间结构升级到了二维。
为了简单起来,我们不妨以二叉树为例。
算法书上将二叉树的遍历分为三种,前序遍历,中序遍历,后序遍历。前序遍历是从父节点开始,左节点,然后右节点,依次遍历;中序遍历是从左节点开始,再遍历父节点,然后右节点;后序遍历是左节点,右节点,父节点。那么,树的遍历,怎么实现呢?
递归、迭代、DFS、BFS、层序遍历、颜色标记法,实现方法有很多。
以本题为例子:
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/submissions/
首先,我们看递归怎么解。
二叉树的结构特点就是,左子树,右子树都是树。于是我们每次取出节点的值,然后左右递归即可。
其次,我们可以放一个栈来辅助我们迭代,严格遵从先取父节点的值,然后存入左儿子,左儿子出栈时,再走右儿子:
接着,我们看下LeetCode上有人发明的颜色标记法,标记两种颜色,gray为访问过的节点,white为没有访问的节。当遇到gray时,把结果写入。当遇到white时,要按照前序遍历的规则反过来将结点和颜色对插入栈中。之所以要反着插入,主要是因为栈的特性是后进先出。所以要保证父节点先出来,再是左节点、右节点。
再接着,关于DFS(深度优先遍历)解法,其实和第一种一样:
最后,关于BFS(广度优先遍历),也就是所谓按层遍历:
如果你觉得本篇写的还不错,请点赞、转发、在看三连哦!