持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情
在上文中,我们介绍了二叉树的基础:算法之二叉树基础
关于二叉树可以使用数组或是链式结构来进行存储,并且它结合了数组、链表的优点:查找数据的速度和数组一样快、插入和删除数据的速度和链表一样快。
接下来一起来看看二叉树的遍历。
遍历
遍历方法
遍历二叉树共有4种方法:
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
特点
- 它们的时间复杂度均为O(n)
- 前序、中序、后序遍历都属于深度优先遍历(DFS)
- 层次遍历属于广度优先遍历(BFS)
区别
前三种方法是通过根节点的遍历顺序来决定的:
- 前序遍历:根 左 右
- 中序遍历:左 右 根
- 后序遍历:左 右 根
当用链式来存储二叉树时,使用递归的方式遍历树节点会是一个非常方便的操作:
代码实现
二叉树在这里可以使用如下结构:
递归版本
这里以前序遍历为例,另外两种只是在递归的顺序上有所不同,其他操作都是相同的:
- 递归的终止条件:root === null,当递归到最后一层叶子结点的时候
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;
};
非递归版本
非递归版本使用栈的方式来实现,当栈不为空时,重复循环里面的步骤
var preorderTraversal = function(root) {
if(!root) return [];
let res = [];
let s = [root];
while(s.length > 0) {
let p = s.shift(); // 取第一个
res.push(p.val);
p.right && s.unshift(p.right);
p.left && s.unshift(p.left);
}
return res;
}
附上题目的链接,一起来遍历二叉树吧!