算法之遍历二叉树

39 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情

在上文中,我们介绍了二叉树的基础:算法之二叉树基础

关于二叉树可以使用数组或是链式结构来进行存储,并且它结合了数组、链表的优点:查找数据的速度和数组一样快、插入和删除数据的速度和链表一样快。

接下来一起来看看二叉树的遍历。

遍历

遍历方法

遍历二叉树共有4种方法:

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 层序遍历

特点

  • 它们的时间复杂度均为O(n)
  • 前序、中序、后序遍历都属于深度优先遍历(DFS)
  • 层次遍历属于广度优先遍历(BFS)

区别

前三种方法是通过根节点的遍历顺序来决定的:

  • 前序遍历:根 左 右
  • 中序遍历:左 右 根
  • 后序遍历:左 右 根

当用链式来存储二叉树时,使用递归的方式遍历树节点会是一个非常方便的操作:

image.png

代码实现

二叉树在这里可以使用如下结构: image.png

递归版本

这里以前序遍历为例,另外两种只是在递归的顺序上有所不同,其他操作都是相同的:

  • 递归的终止条件: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;
}

附上题目的链接,一起来遍历二叉树吧!