二叉树的前序遍历之迭代

上篇文章我们写了二叉树的简介和二叉树递归前序遍历

并且在最后说了二叉树还有两种其它的遍历方式,今天我们就来详细的解析一下迭代遍历二叉树

迭代和递归的区别在于递归的时候是隐式的维护了一个栈,而在迭代的时候需要我们显式的将栈给模拟出来,其余的实现与细节都相同,看下面的图片:


右边是显式声明的栈,左边是树,树的下方是存储遍历结果的数组

第一步 将F放入栈中:


image.png

第二步:将F从栈中取出放入数组, 并获取到F的左子树和右子树,然后将左子树和右子树放入栈中

注意:栈是先入后出,后入先出,所以要先放右子树然后放左子树。


image.png

第三步:将左子树B从栈中取出放入数组,同时将左子树B作为根获取B的左子树和右子树,将获取到的左子树和右子树放入栈中。

注意:这里B没有左子树,也没有右子树,所以不往栈中放入数据


image.png

第四步:将F的右子树A从栈中取出放入数组,同时将A作为根获取 A的左子树和右子树,将获取到的左子树和右子树放入栈中

注意:栈是先入后出,后入先出,所以要先放右子树然后放左子树。


image.png

第五步:将A的左子树D从栈中取出放入数组,同时获取D的左子树和右子树,因为这里D没有子树,所以直接取出D放入数组

第六步同上:


image.png

遍历完成。

是不是看到图的解析之后感觉超级简单,现在上代码:

public static void main(String[] args) {
    Solution solution = new Solution();
    TreeNode t = new TreeNode("F", new TreeNode("B",null,null), new TreeNode("A", new TreeNode("D",null,null), new TreeNode("C",null,null)));
    System.out.println(solution.preorderTraversal(t));
}

public List<String> preorderTraversal(TreeNode root){
    if(root==null){
        return new ArrayList<>();
    }else{
        List<String> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            list.add(tmp.val);
            if(tmp.right!=null)
                stack.push(tmp.right);
            if(tmp.left!=null)
                stack.push(tmp.left);
        }
        return list;
    }
}

画图不易,点个关注再走呗

是春风, 是余晖, 是一道曙光, 是未来可期。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容