算法_ 二叉树遍历(js)

二叉树的前序、中序、后序、层序的遍历

  1. 前序遍历: 先遍历根节点,左子树节点,最后遍历右子树节点
  2. 中序遍历: 先遍历左子树节点,根节点,最后遍历右子树节点
  3. 后序遍历: 先遍历左子树节点,右子树节点,最后遍历根节点
  4. 层序遍历: 按照书的深度一层一层遍历
前序遍历

迭代解法

var preorderTraversal = function(root) {
    var result = []
    var stack = []

    if(root){
        stack.push(root)
    }
    while(stack.length > 0){
            let cutNode = stack.pop()
            result.push(cutNode.val)
            if(cutNode.right != null){
                stack.push(cutNode.right)
            }
            if(cutNode.left != null){
                stack.push(cutNode.left)
            }
        }
    return result
}

递归解法

var preorderTraversal = function(root) {
    var result = []
    if(root == null) return result
    var travel = function(node){
        if(node){
            result.push(node.val)
            travel(node.left)
            travel(node.right)
        }
    }
    travel(root)
    return result
};
中旬遍历

递归解法

var inorderTraversal = function(root) {
 var result = []
    if(root == null) return result
    var travel = function(node){
        if(node){
            travel(node.left)
            result.push(node.val)
            travel(node.right)
        }
    }
    travel(root)

    return result
}
 

迭代解法

var inorderTraversal = function(root) {
	var result = []
    var stack = []
    var node = null
    if(root == null) return result
    node = root
    while(node || stack.length){
        while(node){
            stack.push(node)
            node = node.left
        }
        let popNode = stack.pop()
        result.push(popNode.val)
        node = popNode.right
    }
    return result
}
后序遍历

递归解法

var postorderTraversal = function(root) {
    var result = []
    if(root){
        var travel = function(node){
        if(node){
            travel(node.left)
            travel(node.right)
            result.push(node.val)
            }
        }
        travel(root)
    }
    return result
};

迭代解法

var postorderTraversal = function(root) {
    var result = []
    var stack = []
    if(root){
        stack.push(root)
        while(stack.length > 0){
            let curNode = stack.pop()
            result.unshift(curNode.val)
            if(curNode.left != null){
                stack.push(curNode.left)
            }
            if(curNode.right != null){
                stack.push(curNode.right)
            }
        }
    }
    return result
};
层序遍历

递归解法

var levelOrder = function(root) {
    if(root == null) return []
    var res = []
    travel(root, 0, res)
    return res
};

function travel(root, index, res){
    if(root){
        if(!res[index]) res[index] = []
        res[index].push(root.val)
        travel(root.left, index + 1, res)
        travel(root.right, index + 1, res)
    }
}

迭代解法


var levelOrder = function(root) {
    var result = []
    var queue = []
    if(root == null) return []
    queue.push(root, null)
    var level = []
    while(queue.length > 0){
        let node = queue.shift()
        if(node){
            level.push(node.val)
            if(node.left){
                queue.push(node.left)
            }
            if(node.right){
                queue.push(node.right)
            }
        }else{
            if(queue.length > 0) queue.push(null)
            result.push(level)
            level = []
        }
    }
    return result
};

本题来源于力扣,更多解题思路请看前序遍历中序遍历后序遍历层序遍历

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值