先是递归做法
/**
* 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 {
LinkedList<Integer> list = new LinkedList();
public List<Integer> preorderTraversal(TreeNode root) {
if (root != null){ //如果根结点不等于空,添加到链表中
list.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
}
//走到这里说明根结点等于空,直接什么也不做,返回已有链表
return list;
}
}
再是非递归做法(迭代)
本质上是在模拟递归,因为在递归的过程中使用了系统栈,所以在迭代的解法中常用Stack来模拟系统栈。
/**
* 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 {
Stack<TreeNode> stack = new Stack<>();
ArrayList<Integer> list = new ArrayList<>();
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) return list;
stack.push(root); //根结点入栈
while (!stack.isEmpty()){
TreeNode node = stack.pop(); //根结点弹出
list.add(node.val); //根结点加入list中
if (node.right != null) stack.push(node.right);
if (node.left != null) stack.push(node.left);
}
return list;
}
}
迭代的先序遍历结点顺序是:根,左,右,所以先是遍历根节点,然后是左子树,再是右子树。用队列肯定实现不了,因为队列是先入先出,而这里要求先遍历完左子树的所有结点才能遍历右子树。故而要使用栈
首先我们应该创建一个Stack用来存放节点,首先我们想要打印根节点的数据,此时Stack里面的内容为空,所以我们优先将头结点加入Stack,然后打印。
之后我们应该先打印左子树,然后右子树。所以先加入Stack的就是右子树,然后左子树。
关于二叉树三种递归(非递归)遍历方式的详细讲解,点此进入