zoukankan      html  css  js  c++  java
  • LeetCode144与LeetCode145,前序遍历与后序遍历

    用递归的话这两个题是很简单的。

    在非递归的情况,使用迭代做这个两个题目,两个题目间的联系是很紧密的。

    首先是LeetCode144,前序遍历二叉树:

    前序遍历的顺序为:根,左,右。

    对这个顺序下,很容易想到使用一个栈即可完成遍历,流程有:

    1).根节点入栈

    2).读取根节点出栈

    3).右节点与左节点入栈.

    迭代这个流程直到栈空。

    其次是LeetCode145,后序遍历二叉树:

    后序遍历的顺序为:左,右,根。

    有一种思路是:

    首先记录最近遍历的那个节点

    然后考虑目前栈顶的这个节点,如果栈顶节点为:

    1).叶子节点:说明是叶子,应该遍历了

    2).最近遍历节点为栈顶的右子节点:说明它的左右子树已经便遍历完了,它应该作为根被遍历

    否则,应该按右,左的顺序入栈。

    如此遍历直到栈空。

    另有一种思路,利用了与前序遍历的联系:

    前序遍历的流程:

    根节点,左子树,右子树

    而后续遍历的流程为:

    左子树,右子树,根

    后续遍历可以看做将 :

    根,右子树,左子树

    的遍历顺序翻转的结果。

    而对于先遍历根的遍历方法,我们已经有了前序遍历的思路了,只需要将左右子树入栈的顺序调换下即可:

    前序遍历的思路是:

    1).根节点入栈

    2).读取根节点出栈

    3).右节点与左节点入栈.

    现在对于

    根,右子树,左子树这个顺序只需要更改下3)即可:

    1).根节点入栈

    2).读取根节点,根节点出栈

    3)左节点入栈,右节点入栈.

    这个结果就是 根 右子树 左子树的遍历顺序

    只需要将这个结果翻转,即可得到后序遍历的顺序。

  • 相关阅读:
    网线
    第19次实验
    矩阵乘法
    20次试验
    视频笔记
    1
    effective C++ 条款 34:区分接口继承和实现继承
    effective C++ 条款 35:考虑virtual函数以外的其他选择
    effective C++ 条款 29:为“异常安全”而努力是值得的
    effective C++ 条款 27:尽量少做转型动作
  • 原文地址:https://www.cnblogs.com/lxy-xf/p/11125356.html
Copyright © 2011-2022 走看看