[路飞]_算法·每日解读--遍历二叉树的不同方式[层级遍历和锯齿遍历]

384 阅读2分钟

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

1.leetcode-二叉树的层序遍历

题解102: leetcode-二叉树的层序遍历

上篇文章详细的介绍了二叉树的三种遍历方法,本篇我们来看一下其他两种较为高深一点的遍历方法 ==> kaigao!

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

解决这种中等难度中下等的题,应该算是比较的容易了,那么根据题意要点,先来走一下解题思路:

  1. 层序遍历,也就是说要把每层的val进行分层保存,那么需要创建一个二维数组
  2. 层层遍历,还需要传入一个参数k来记录所遍历的层数
  3. 递归或迭代的方法选择,可定选择递归(方法调用自身,so easy

代码搞起:

var levelOrderBottom = function(root){
    let ans = []; //创建空数组,用构造二维数组进行存储每层val
    getResult(root, 0, ans); //调用函数getResult,同时传入参数,中间的0表示当前数组和层级为0 ,在这里函数拆分出去了,其实可以写在内部
    return ans;
};
var getResult = function(root, k, ans){
    if(!root) return null;  
    if(k == ans.length) ans.push(new Array()); //每走完一步,向数组中添入一个新的空数组,在这里可以自己琢磨一下if条件
    ans[k].push(root.val);  //接下来向 第k个下标的内部数组中,存入当前root的val
    getResult(root.left, k + 1, ans);   //递归执行左右,每个节点的左右都有getResult海曙的执行过程,k值加1,增加层数
    getResult(root.right, k + 1, ans)
    return ans
}
​
  • 代码解读已经够详细了,但是还需重视两点:①每层执行的左右过程一定要理清,可以动笔画一下 ②循环时候的 k 和层 val 以及 ans.length 的关系

leetcode-107.二叉树的层序遍历Ⅱ leetcode-103. 二叉树的锯齿形层序遍历

以上两题算是本题的加强版,思路相似,只是多了一些判断条件:

2.leetcode-107.二叉树的层序遍历Ⅱ

题意要求返回遍历后的二位数是由其自底向上的层序遍历,那么我们只需进行数组的反转即可。

在主函数中添加以下代码即可实行反转

for (let i = 0, j = ans.length - 1; i < j; i++, j--) {
    [ans[i], ans[j]] = [ans[j], ans[i]];
  }
  • 第一个值和最后一个值进行位置互换,同时,ij 进行加 1 减 1 操作,直到最后left不小于right

3.leetcode-103. 二叉树的锯齿形层序遍历

锯齿形层序遍历则是对奇数偶数层级的不同排列方式,废话少说--上代码(主函数中加入此段代码)

for (let k = 1; k < ans.length; k += 2) {
    for (let i = 0, j = ans[k].length - 1; i < j; i++, j--) {
      [ans[k][i], ans[k][j]] = [ans[k][j], ans[k][i]];
    }
  }
  • 对层级 k 进行循环查找,满足偶数情况时,将 k 所对应 ans 中下标为k的数组值进行反转

👆 👆 以上就是个人对【二叉树不同的层序遍历】的代码解法和方法解读。

讲真,刷题会上瘾,写文章也会上瘾!!! 写于11月25日00点56分

完成代码请移步: 稍后添加