题目描述:

题目链接:LeetCode-144-二叉树的前序遍历
递归法
解题思路:
方法一:递归。
要先清楚前序遍历的顺序:先根节点,再左子树,再右子树。
然后是递归三部曲:
- 确定递归函数的参数和返回值:这里直接使用力扣给的函数即可,不需要额外定义;
- 终止条件:当当前遍历的节点为null 的时候结束递归;
- 确定单层递归的逻辑:也就是递归的顺序:先根节点,再左子树,再右子树。
代码实现:
class Solution {
    List<Integer> list = new ArrayList<>();
    public List<Integer> preorderTraversal(TreeNode root) {
        if (root == null) {
            return new ArrayList<>();
        }
        list.add(root.val);
        preorderTraversal(root.left);
        preorderTraversal(root.right);
        return list;
    }
}
非递归法
解题思路:
方法二:非递归
要先清楚前序遍历的顺序:先根节点,再左子树,再右子树。
利用栈的特点:”先进后出“,来存放遍历的节点。
前序遍历:中左右。 则 入栈顺序: 中->右->左
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        if (root == null) {
            return new ArrayList<>();
        }
        stack.push(root);// 根节点先入栈
        // 前序遍历:中左右  入栈顺序: 中->右->左
        // 开始处理栈,先放右孩子,再放左孩子,这样出栈的顺序才是 前序遍历的顺序
        while (!stack.isEmpty()) {
            TreeNode tmp = stack.pop();
            if (tmp != null) {// 加一个判断,不为空再加入
                list.add(tmp.val);// 加到数组中
            } else {
                continue;
            }
            stack.push(tmp.right);// 依次加入右孩子和左孩子
            stack.push(tmp.left);
        }
        return list;
    }
}



















