持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
前言
说到遍历二叉树,大家肯定都不陌生。想当年上数据结构这门课程的时候,老师给出二叉树,让我们给出遍历的结果,那个过程对于初学者可真是痛苦绝望阿。
遍历
遍历就是按某条搜索路径访问树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。
深度遍历
这篇文章主要讲述深度遍历。二叉树的遍历有前序遍历、中序遍历、后序遍历。
二叉树由根、左子树、右子树构成,三者的组合可构成6种 遍历方案:根左右、根右左、左根右、左右根、右根左、右左根。如果限定先左后右则有三种实现方案:
- 根左右——先序遍历
- 左根右——中序遍历
- 左右根——后序遍历
当时老师讲了很多怎么去遍历(根据一个二叉树,写出它的前中后序遍历结果),虽然记住了但是也是不理解为什么要这样做。当时记得听了MOOC上的一节课有了一点点明朗。
老师说前序、中序、后序遍历过程中经过节点的路线一样,只是访问节点的时机不同。就像这张图表示的。
直到开始刷题我才真正理解这句话(所以理论不要脱离实践 大家要好好自学呀)。
下面是前序遍历递归做法:
var preorderTraversal = function(root) {
let res=[];
const dfs=function(root){
if(root===null)return ;
//先序遍历所以从父节点开始
res.push(root.val);
//递归左子树
dfs(root.left);
//递归右子树
dfs(root.right);
}
dfs(root);
return res;
};
在递归中,前序、中序、后序遍历只是节点存入数组中的顺序不同,其他都是一样的!
后记
永远不要让理论脱离实践!