vlambda博客
学习文章列表

二叉树的前序遍历之迭代

@2021 SLIGHT HEAT

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

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


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

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



第一步 将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; }}

下次有机会给大家讲一下二叉树的前序遍历之Morris 遍历,画图不易,点个关注再走呗


SLIGHT HEAT  #2021#