leetcode144/102/103 二叉树的各种遍历节点

本文详细介绍了二叉树的前序、中序、后序遍历以及层序遍历的实现,包括递归和迭代的方法。还特别提到了Z型层序遍历,即在层序遍历的基础上改变奇偶层的元素插入顺序。代码清晰易懂,适合初学者掌握二叉树遍历算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的遍历节点算法题有几种类型:

  1. 前/中/后序遍历
  2. 层序遍历
  3. Z型层序遍历

前/中/后序遍历

首先从前中后序遍历来看,三者的代码基本一致,就是不同顺序代码的顺序也换换。前序是根节点第一个也就是最先遍历,中后同理。一般来说用的是递归,比较简单直接放代码

var preorderTraversal = function(root, res=[]) {
    if (!root) return res
    res.push(root.val)
    preorderTraversal(root.left, res)
    preorderTraversal(root.right, res)
    return res
};

要注意的点不多,⚠️别忘了最后也要返回一次res。可以换一种更容易懂的写法:

var preorderTraversal = function(root) {
    const res=[]
    function traversal(root, res) {
        if (!root) return res
        res.push(root.val)
        traversal(root.left, res)
        traversal(root.right, res)
        return res
    }
    return traversal(root, res)
};

层序遍历

用的基础好理解的写法,有几个需要注意的点⚠️。
是双层循环,外层是判断整体是否遍历完成,内层是判断这一层是否遍历完成,那么在当前的这一层循环结束后下一层循环开始前,需要做两件事:
1 知道下一层的节点个数用于循环,不能边循环边取,因为stack的长度会越来越小
2 在res中放入一个新的占位数组。然后最后不要忘了return。
同时在第一次判断没有root时记得返回的是一个空数组

var levelOrder = function(root) {
    if(!root) {
        return []
    }
    const stack=[]
    const res=[]
    stack.push(root)
    while(stack.length!==0){
        let len=stack.length
        res.push([])
        for(let i=0;i<len;i++){
           const node=stack.shift()
           res[res.length-1].push(node.val)
           if(node.left) stack.push(node.left)
           if(node.right) stack.push(node.right)
        }
    }
    return res
};

Z型层序遍历

这个和层序遍历思路一致,但加多一个计数的变量,在偶数行就从右边开始数起,这个数起指的是数据从前面加入到数组中,即用unshift来代替push

var zigzagLevelOrder = function(root) {
    if(!root) return []
    const stack=[]
    const res=[]
    let count=0
    stack.push(root)
    while(stack.length!==0){
        const len=stack.length
        res.push([])
        for(let i=0;i<len;i++){
            const node=stack.shift()
            if(count%2==0){
              res[res.length-1].push(node.val)
            }else{
                res[res.length-1].unshift(node.val)
            }
            if(node.left) stack.push(node.left)
            if(node.right) stack.push(node.right)
        }
        count++
    }
    return res
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值