迭代实现二叉树的遍历(算法村第七关黄金挑战)

迭代实现前序遍历

144. 二叉树的前序遍历 - 力扣(LeetCode)

题解的迭代方式

因为在递归的过程中使用了系统栈,所以在迭代的解法中常用 Stack 来模拟系统栈,来模拟递归。

首先创建一个 Stack 用来存放节点,此时 Stack 为空,优先将根结点加入 Stack,然后进行相关处理(打印、加入列表等等)。

之后我们应该先处理左子树,然后右子树。所以先加入 Stack 的应该是右子树,然后左子树。

java 复制代码
public List<Integer> preorderTraversal(TreeNode root)
{
    //树中节点数目在范围 [0, 100] 内
    if (root == null)
        return new ArrayList<>();

    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();
    stack.add(root);

    while (!stack.isEmpty())
    {
        TreeNode node = stack.pop();
        answer.add(node.val);

        if (node.right != null)
            stack.push(node.right);
        if (node.left != null)
            stack.push(node.left);
    }

    return answer;
}

算法村的迭代方式

java 复制代码
public List<Integer> preorderTraversal_3(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            answer.add(root.val);
            stack.push(root);
            //先遍历左子树
            root = root.left;
        }

        TreeNode curNode = stack.pop();
        //再遍历右子树
        root = curNode.right;
    }

    return answer;
}

迭代实现中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

中序遍历是左中右,先访问二叉树左子树的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(把节点的val放进 answer 列表中)

当处理完最小单位的子树时,返回到上层处理中间节点。如果有右节点,也要就其进行中序遍历。

java 复制代码
public static List<Integer> inorderTraversal(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            stack.push(root);
            root = root.left;
        }

        TreeNode curNode = stack.pop();
        answer.add(curNode.val);

        root = curNode.right;
    }

    return answer;
}

迭代实现后序遍历

145. 二叉树的后序遍历 - 力扣(LeetCode)

将后序遍历序列反转后得到的序列是"中右左",而前序遍历序列是"中左右"。所有,我们将前序遍历的遍历次序改变一下,再把结果完全反转,即可得到所要的后序遍历序列。

java 复制代码
public List<Integer> postorderTraversal(TreeNode root)
{
    ArrayList<Integer> answer = new ArrayList<>();

    ArrayDeque<TreeNode> stack = new ArrayDeque<>();

    //再次返回根结点时会出现栈空但root不等于null的情况,此时要遍历根结点的右子树
    //不需要往栈中提前添加根结点!!!
    while (!stack.isEmpty() || root != null)
    {
        while (root != null)
        {
            answer.add(root.val);
            stack.push(root);
            //先遍历右子树
            root = root.right;
        }

        TreeNode curNode = stack.pop();
        //再遍历左子树
        root = curNode.left;
    }

    //反转"右前序遍历"的序列,得到后序遍历的序列
    Collections.reverse(answer);

    return answer;
}
相关推荐
Simon_lca几秒前
验厂不翻车!Acushnet 11 项核心政策 + 自查要点,一文搞定
大数据·人工智能·经验分享·算法·制造
智者知已应修善业18 分钟前
【51单片机按键控制流水灯+数码管显示按键次数】2023-6-15
c++·经验分享·笔记·算法·51单片机
汉克老师23 分钟前
GESP2023年12月认证C++三级( 第三部分编程题(1、小猫分鱼))
c++·算法·模拟算法·枚举算法·gesp三级·gesp3级
不知名的老吴26 分钟前
View的三大特性之一:迟绑定
开发语言·c++·算法
小雅痞36 分钟前
[Java][Leetcode hard] 135. 分发糖果
java·算法·leetcode
黎阳之光40 分钟前
黎阳之光:全域实景立体管控,重构智慧电厂与变电站数字孪生新范式
大数据·人工智能·算法·安全·数字孪生
嘻嘻哈哈樱桃43 分钟前
数据流中的中位数 力扣--160
算法·leetcode·职场和发展
老约家的可汗1 小时前
深入浅出:Map与Set的核心原理与使用场景
数据结构·算法
j_xxx404_1 小时前
力扣算法题:字符串(最长公共前缀|最长回文子串)
c++·算法·leetcode
承渊政道1 小时前
【递归、搜索与回溯算法】(穷举vs暴搜vs深搜vs回溯vs剪枝:一文讲清概念与用法)
数据结构·c++·算法·决策树·深度优先·剪枝·宽度优先