我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战
94. 二叉树的中序遍历
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
解法一:递归
var inorderTraversal = function(root, res = []) {
if(!root)return res
// 我们需要遍历的顺序是 左 根节点 右
inorderTraversal(root.left, res)
res.push(root.val)
inorderTraversal(root.right, res)
return res
}
递归解法我们需要将res保存一下临时结果。最终返回,所以需要作为参数不断传入。
解法二:迭代
var inorderTraversal = function(root) {
// 判断边界
if(!root) return []
var res = [], stack = []
// 这些节点又不急于放到遍历结果中,这里我们需要栈来保存节点这里我们需要栈来保存节点
while(stack.length || root){
while(root){
// 先根节点后左子树入栈
stack.push(root)
root = root.left
}
// 此时root=null 说明上一步没有左子树
// 1. 执行左出栈 此时root = null ,导致root.right 一定为空
// 2. 执行下次外层循环,根出栈,此时root.right可能存在
// 3. 若有right ,右入栈在出栈
// 4. 若right 不存在则重复2步骤
root = stack.pop()
res.push(root.val)
root = root.right
}
return res
};
144. 二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
解法一:递归
var inorderTraversal = function(root, res = []) {
if(!root)return res
// 我们需要前序遍历的顺序是 根节点 左 右
res.push(root.val)
inorderTraversal(root.left, res)
inorderTraversal(root.right, res)
return res
}
解法二 迭代法
var preorderTraversal = function(root) {
if(root==null)return []
var res = [], stack= []
// 当栈为空或节点不存在时停止循环
while(stack.length || root){
// 先根后左子树入栈
while(root){
res.push(root.val)
stack.push(root)
root = root.left
}
// 1. 此时root = null, 说明一定没有左子树,并且root.right一定不存在
// 2. 接着执行下一次外层循环,根出栈,此时root.right 可能存在
// 3. 若root.right存在 先入栈 后出栈
// 4. 若root.right不存在 则继续第2个步骤
root = stack.pop()
root = root.right
}
return res
};
相关文章
结束语
如果您喜欢我的文章,可以[关注⭐]+[点赞👍]+[评论📃],您的三连是我前进的动力,期待与您共同成长~