「栈模拟迭代」—递归算法优化

模拟系统执行「递归」的过程

具体应用:

给定一个 n 叉树的根节点 root 返回 其节点值的 前序遍历 

递归做法:

class DFS{
    public List<Integer> preorder(Node root){
        List<Integer> res = new ArrayList<>();
        dfs(root,res);
        return res;
    }

    public void dfs(Node root,List<Integer> res){
        if(null == root) return;
        //前序遍历位置
        res.add(root.val);
        List<Node> children = root.children;
        for(Node child: children){
            dfs(child,res);
        }
    }
}

迭代做法

class Solution{
    public List<Integer> preorder(Node root){
        //这是结果数组
        List<Integer> res = new ArrayList<>();
        //判空
        if(null == root) return res;
        //栈,利用栈模拟递归
        Deque<Node> stack = new ArrayDeque<Node>();
        stack.push(root);
        while(!stack.isEmpty()){
            //出栈,拿的是栈顶的
            Node pop = stack.pop();
            if(pop == null) continue;
            //将当前遍历的节点的值 添加到结果数组中
            res.add(pop.val);
            //当前节点的孩子节点
            List<Node> children = pop.children;
            //将每个孩子节点,压入栈中,进行下一次遍历
            for(int i = children.size()-1;i>=0;i--){
                //   ?问:为什么这里要倒序遍历压栈
                //   因为是前序遍历,意味着孩子节点要从左往右遍历,如4的孩子节点{1,2,3},前序遍历应该是{4,1,2,3},倒序压栈后栈顶就是1了
                stack.push(children.get(i));
            }
        }
        return res;
    }
}
Licensed under CC BY-NC-SA 4.0
Last updated on Mar 23, 2024 06:11 UTC
让过去的过去,给时间点时间
Built with Hugo
Theme Stack designed by Jimmy