《算法通关村—迭代实现二叉树的前序遍历》
利用递归进行二叉树的前序遍历是非常容易的几行代码就能解决。但是你知道如何用迭代实现吗?
理论上来说能够用递归解决的都能用迭代解决,我们就来试试用迭代解决二叉树的前序遍历问题吧。
什么是前序遍历,比如一颗二叉树如下图:
这个二叉树经过前序遍历得到的结果就是1、3、5、2
.
对应leetcode的·144题大家可以去看看
我们用递归进行实现(下面代码中会出现关于TreeNode的定义):
public List<Integer> preorderTraversal(TreeNode root){List<Integer> res = new ArrayList<Integer>();if(root == null){return res;}preOrder(root,res);return res;
}
public void preOrder(TreeNode node ,List<Integer> res){if(node == null){return ;}res.add(node.val);preOrder(node.left,res);preOrder(node.right,res);
}
如果利用迭代实现:
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer> res = new ArrayList<Integer>();if(root == null){return res;}Deque<TreeNode> stack = new LinkedList<TreeNode>();TreeNode node = root;while(!stack.isEmpty() || node!=null){while(node != null) {res.add(node.val);stack.push(node);node = node.left;}node = stack.pop();node = node.right;}return res;}}
理解迭代遍历代码:
首先进入的是root节点,先把1放入结果列表中,并且把1放入栈
通过中间的while循环来到node.val=3的节点,继续把3放入结果列表,并放入栈中。
这是在中层的while循环第一次退出。
退出后,node又等于了栈中的node并且出栈,然后令node = node.right然后进行下一次,
进行同样的操作,后面看图理解就好
点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?
也可以加我QQ(2837468248)咨询说明来意!