算法通关村7-3 二叉树遍历的递归和迭代解法

前序遍历 LeetCode144

  • 递归
var preorderTraversal = function(root) {
    let number = new Array()
    function traverse(node) {
        if(node === null) return
        number.push(node.val)
        traverse(node.left)
        traverse(node.right)
    }
    traverse(root)
    return number
};
  • 迭代
var preorderTraversal = function(root) {
    let number = new Array()
    let stack = new Array()
    let node = root
    while(node != null || stack.length != 0) {
        while(node != null) {
            number.push(node.val)
            stack.push(node)
            node = node.left
        }
        node = stack.pop()
        node = node.right
    }

    return number
};

中序遍历 LeetCode94

  • 递归
var inorderTraversal = function(root) {
    let number = new Array()
    function traverse(node) {
        if(node == null) return
        if(node.left != null) traverse(node.left)
        number.push(node.val)
        if(node.right != null) traverse(node.right)
    }
    traverse(root)
    
    return number
};
  • 迭代
var inorderTraversal = function(root) {
    let number = new Array()
    let stack = new Array()
    let node = root
    while(node != null || stack.length != 0) {
        while(node != null) {
            stack.push(node)
            node = node.left
        }
        node = stack.pop()
        number.push(node.val)
        node = node.right
    }

    return number
};

后序遍历 LeetCode145

  • 递归
var postorderTraversal = function(root) {
    let number = new Array()
    function traverse(node) {
        if(node == null) return
        if(node.left != null) traverse(node.left)
        if(node.right != null) traverse(node.right)
        number.push(node.val)
    }
    traverse(root)

    return number
};
  • 迭代

    • 反转法,观察可得后序遍历结果刚好同”中-右-左“遍历结果相反

      var postorderTraversal = function(root) {
          let number = new Array()
          let stack = new Array()
          let node = root
          while(node != null || stack.length != 0) {
              while(node != null) {
                  number.push(node.val)
                  stack.push(node)
                  node = node.right
              }
              node = stack.pop()
              node = node.left
          }
      
          number.reverse()
          return number
      };
      
    • 访问标记法,待访问结点出栈时为若不存在标记则将其标记为 true 并重新入栈,出栈时存在标记则将值记录

      var postorderTraversal = function(root) {
          let number = new Array()
          let stack = new Array()
          let map = new Map()
          let node = root
          while(node != null || stack.length != 0) {
              while(node != null) {
                  stack.push(node)
                  node = node.left
              }
              node = stack.at(-1) // 待访问结点
              while(stack.length != 0 && map.has(node)) {
                  // 左右侧均已经访问
                  number.push(node.val)
                  stack.pop()
                  node = stack.at(-1) // 更新待访问结点
              }
              if(stack.length != 0) {
                  // 右侧还未访问
                  map.set(node, true)
                  node = node.right
              }
          }
      
          return number
      };
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值