时间: 2020-08-30|tag:54次围观|0 条评论

寒假的时候百度实习一面被问到了这个,没做出来,补习一下

利用栈结构

前序核心思想为:

  1. 每拿到一个 节点 就把它保存在 栈 中
  2. 继续对这个节点的 左子树 重复 过程1,直到左子树为 空
  3. 因为保存在 栈 中的节点都遍历了 左子树 但是没有遍历 右子树,所以对栈中节点 出栈 并对它的 右子树 重复 过程1,2
  4. 直到遍历完所有节点
    前序中序后序都通用的模板为(以前序遍历为例)
 def preorderTraversal(root: TreeNode): List[Int] = {    // 用一个栈来保存中间结果    val stack = new mutable.Stack[TreeNode]()    val result = new mutable.ListBuffer[Int]()    var temp = root    while(temp != null || stack.nonEmpty) {      if (temp != null) {        // 每遇到一个节点,就把它加入结果集,并把该节点保存到中间结果中        result.+=(temp.value)        stack.push(temp)        // 先遍历左子树,一直走到空        temp = temp.left      } else {        // 左子树走到空,就从获取已经遍历过左子树的中间结果,将它出栈,并遍历它的右子树        val node = stack.pop()        temp = node.right      }    }作者:18211010139链接:https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/die-dai-jie-fa-shi-jian-fu-za-du-onkong-jian-fu-za/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

中序遍历在出栈时访问结点
后序遍历将插入结果列表尾部改为头部,先查看右节点再看左节点
参考资料
https://leetcode-cn.com/problems/binary-tree-postorder-traversal/solution/die-dai-jie-fa-shi-jian-fu-za-du-onkong-jian-fu-za/

文章转载于:https://www.jianshu.com/p/ceeafa3c17d6

原著是一个有趣的人,若有侵权,请通知删除

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自起风了,原文地址《二叉树遍历算法非递归实现
   

还没有人抢沙发呢~