「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
一、二叉树的前序遍历
给你二叉树的根节点
root,返回它节点值的 前序 遍历。首先在做题之前必须要明白二叉树的结构,在给定的
root中,它的结构始终是[root,left,right,Lleft,Lright,Rleft,Rright……],在用数组表示的二叉树中,如果left或right节点没有的时候,则用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去除了而已
二、二叉树的中序遍历
给定一个二叉树的根节点
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
};
- 没有其他需要解释的,只需明白一点:中序遍历存储顺序为 左根右
三、二叉树的后序遍历
给定一个二叉树,返回它的 后序 遍历。
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
};
- 同理,后序遍历的存储顺序为 左右根
灵魂总结:
前中后三个不同的遍历方式,不同点只在于存储的方式,但要注意的是,这三种遍历形式都是从头部开始,依次向下伸展(应该是头遍历)
👆 👆 以上就是个人对【二叉树前、中、后序遍历】的简单理解。
如果能够解开您的迷惑,不要忘记一键三连哟!!!
循环、递归与迭代请移步: 稍后添加😀