[路飞]_知识·秒懂前端--你想要的三种二叉树遍历方法

411 阅读2分钟

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

一、二叉树的前序遍历

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

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

首先在做题之前必须要明白二叉树的结构,在给定的root中,它的结构始终是[root,left,right,Lleft,Lright,Rleft,Rright……],在用数组表示的二叉树中,如果leftright节点没有的时候,则用null进行填充;

而在我们进行遍历的时候,将会进行筛查,将节点为null的进行删除,从而对遍历到的每个节点的值进行保存。

var preorderTraversal = function(root){
    if(!root) return []
    let result = [] //定义一个空数组用于存放遍历到的二叉树节点的值
    /**
    result.push(root.val)  //首先将根节点的val push到result中
    result.push(root.left) //接着将root的left节点进行push
    result.push(root.right)//然后将root的right节点进行push
    //完成以上三步后,一个节点包括根节点,左节点,右节点
    */
    //但是我们要进行的是将所有节点逐一遍历,在这里就需要进行迭代,分别将left和right做为root(接下来的根节点)[执行到最后一个left时,也相当于一个根],依次执行函数preorderTraversal,完整的递归代码如下
    result.push(root.val)
    result.push(...preorderTraversal(root.left))
    result.push(...preorderTraversal(root.right))
    //这里使用了...展开运算符,避免在push的过程中造成多维数组
    return result
}
  • 重点是能够明白遍历过程中root的变换与递归关系
  • 前序遍历执行后,用于存储遍历后二叉树的节点val的顺序仍然是前中后,只不过是把节点null去除了而已

二、二叉树的中序遍历

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

给定一个二叉树的根节点 root ,返回它的 中序 遍历。

var inorderTraversal = function(root) {
    if(!root) return []
    let res = []
    res.push(...inorderTraversal(root.left))
    res.push(root.val)
    res.push(...inorderTraversal(root.right))
    return res
};
  • 没有其他需要解释的,只需明白一点:中序遍历存储顺序为 左根右

三、二叉树的后序遍历

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

给定一个二叉树,返回它的 后序 遍历。

var postorderTraversal = function(root) {
    if(!root) return []
    let res = []
    res.push(...postorderTraversal(root.left))
    res.push(...postorderTraversal(root.right))
    res.push(root.val)
​
    return res
};
  • 同理,后序遍历的存储顺序为 左右根

灵魂总结:

前中后三个不同的遍历方式,不同点只在于存储的方式,但要注意的是,这三种遍历形式都是从头部开始,依次向下伸展(应该是头遍历)

👆 👆 以上就是个人对【二叉树前、中、后序遍历】的简单理解。

如果能够解开您的迷惑,不要忘记一键三连哟!!!

循环、递归与迭代请移步: 稍后添加😀