二叉树的前序遍历之迭代

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

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

 

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

 

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

 

第一步 将F放入栈中:

 

 

 

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

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

 

 

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

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

 

 

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

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

 

 

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

第六步同上:

 

 遍历完成。

 

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

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;
    }
}

  

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

 

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

posted @ 2021-07-11 16:39  博客小屋  阅读(326)  评论(0编辑  收藏  举报