二叉树的前序遍历

95 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

一、题目

LeetCode 二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

示例 5:

输入:root = [1,null,2]
输出:[1,2]

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

二、题解

需要对给定的一个二叉树进行前序遍历,前序遍历就是先遍历二叉树的根节点,然后如果左子树不为空的话就先遍历左子树节点,最后如果右子树不为空的话就在遍历右子树节点,对于左右子树的节点遍历也是如此。

方法一

可以直接根据前序遍历的规则来用递归方法遍历二叉树的节点,首先需要定义一个数组list来记录后续遍历的结果,然后定义递归方法来遍历二叉树节点,参数首先就需要的是二叉树根节点了,然后还得要一个数组记录遍历的结果,首先判断如果当前参数的树节点为空的话就直接结束递归,说明之后没有节点了,否则遍历根节点,获取根节点的值加入到结果数组中,然后再获取根节点的左子树去递归遍历,然后再获取根节点的右子树去递归遍历,最后在递归遍历完成的时候返回数组中记录的结果。

方法二

也可以直接通过一个栈来辅助遍历,首先定义一个栈,然后先将根节点加入栈中,当栈元素不为空的时候遍历栈元素,就是依次取出栈顶元素节点,如果这个节点为空的话就可以忽略,否则就获取这个节点的根节点值加入到结果数组中,然后获取这个节点的左子树节点加入到栈中,最后再获取这个节点的右子树节点也加入到栈中,最后遍历完成返回结果即可。

三、代码

方法一 Java代码

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        dfs(root, list);
        return list;
    }
        public void dfs(TreeNode root, List<Integer> list) {
        if (root == null) {
            return;
        }
        list.add(root.val);
        dfs(root.left, list);
        dfs(root.right, list);
    }
}

时间复杂度:O(n),需要遍历一次二叉树的节点

空间复杂度:O(n),需要使用一个数组记录遍历结果以及递归消耗栈空间。


方法二 Java代码

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        if (null == root) {
            return list;
        }
        Deque<TreeNode> deque = new LinkedList<>();
        deque.addFirst(root);
        while (!deque.isEmpty()) {
            TreeNode node = deque.removeFirst();
            if (node == null) {
                continue;
            }
            list.add(node.val);
            deque.addFirst(node.right);
            deque.addFirst(node.left);
        }
        return list;
    }
}

时间复杂度:O(n),需要遍历一次二叉树的节点

空间复杂度:O(n),需要使用一个数组记录遍历结果以及遍历使用栈辅助。