当前位置:   article > 正文

遍历二叉树的统一迭代法

遍历二叉树的统一迭代法

二叉树的统一迭代法

普通迭代遍历方式无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况,前中后序的迭代法各有区别,那么如何实现统一的代码写法呢

那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记

如何标记呢? 

就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法

JavaScript代码:

迭代法中序遍历

  1. /**
  2.   * @param {TreeNode} root
  3.   * @return {number[]}
  4.   */
  5.  var inorderTraversal = function(root) {
  6.    // 统一迭代法
  7.    const res = []
  8.    if(!root) return res
  9.    const stack = [root]
  10.    while(stack.length){
  11.      const n = stack.pop()
  12.      if(!n){ // 只有遇到空节点的时候,才将下一个节点放进结果集
  13.        res.push(stack.pop().val)
  14.        continue
  15.     }
  16.  ​
  17.      n.right && stack.push(n.right)  // 右先放入栈后访问
  18.      stack.push(n)
  19.      stack.push(null)  // 节点访问过,但是还没有处理,加入空节点做为标记。
  20.      n.left && stack.push(n.left)  //左后放入栈先访问   实现 左-中-右
  21.   }
  22.    return res
  23.  }

迭代法先序遍历

  1.  /**
  2.   * @param {TreeNode} root
  3.   * @return {number[]}
  4.   */
  5.  var inorderTraversal = function(root) {
  6.    // 统一迭代法
  7.    const res = []
  8.    if(!root) return res
  9.    const stack = [root]
  10.    while(stack.length){
  11.      const n = stack.pop()
  12.      if(!n){ // 只有遇到空节点的时候,才将下一个节点放进结果集
  13.        res.push(stack.pop().val)
  14.        continue
  15.     }
  16.  ​
  17.      stack.push(n)
  18.      stack.push(null)  // 节点访问过,但是还没有处理,加入空节点做为标记。
  19.      n.right && stack.push(n.right)  // 右先放入栈后访问
  20.      n.left && stack.push(n.left)  // 左后放入栈先访问   实现 中-左-右
  21.      
  22.   }
  23.    return res
  24.  }

迭代法后序遍历

  1. /**
  2.   * @param {TreeNode} root
  3.   * @return {number[]}
  4.   */
  5.  var inorderTraversal = function(root) {
  6.    // 统一迭代法
  7.    const res = []
  8.    if(!root) return res
  9.    const stack = [root]
  10.    while(stack.length){
  11.      const n = stack.pop()
  12.      if(!n){ // 只有遇到空节点的时候,才将下一个节点放进结果集
  13.        res.push(stack.pop().val)
  14.        continue
  15.     }
  16.  ​ stack.push(n)
  17.      stack.push(null)  // 节点访问过,但是还没有处理,加入空节点做为标记。
  18. n.left && stack.push(n.left)  //左先放入栈后访问  
  19.      n.right && stack.push(n.right)  // 右后放入栈先访问 实现 左-右-中
  20.   }
  21.    return res.reverse() // 结果集倒序输出即可
  22.  }

 可以做一做leetcode上三道题目,分别是:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/580777
推荐阅读
相关标签
  

闽ICP备14008679号