先把递归解法的代码贴上:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
addNode(root, list);
return list;
}
public void addNode(TreeNode root, List<Integer> list){
if(root== null) return;
list.add(root.val); // 前序遍历是,跟在前。。。我连这个都忘了。。。汗死。。。
addNode(root.left, list);
addNode(root.right, list);
}
}
然后是迭代解法的算法,和inorder的总体思路一样,用stack来记录所有走过的node,但是处理的顺序不一样,操作的过程和代码也就相应的不一样了。
在设置while 循环条件时,考虑到前序遍历过程和层序遍历很像,所以只要检查stack是否为空即可。代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root==null) return result;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){ // 这里的逻辑可以理解为倒三角式的输出,先把尖儿压出并输出了,然后压出右和左,有点像层序遍历啊!所以只要检查stack是否为空了,就像层序遍历中,看LinkedList是否为空一样啊!!
TreeNode visiting=stack.pop(); // 这个命名visiting非常好,准确表达了意思
result.add(visiting.val);
if(visiting.right!=null) stack.push(visiting.right); // 先压右边,先压后出
if(visiting.left!=null) stack.push(visiting.left); // 再压左边,后压先出
}
return result;
}
}