《算法通关村—迭代实现二叉树的前序遍历》
利用递归进行二叉树的前序遍历是非常容易的几行代码就能解决。但是你知道如何用迭代实现吗?
理论上来说能够用递归解决的都能用迭代解决,我们就来试试用迭代解决二叉树的前序遍历问题吧。
什么是前序遍历,比如一颗二叉树如下图:
这个二叉树经过前序遍历得到的结果就是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)咨询说明来意!