144. Binary Tree Preorder Traversal

naive级别递归三连其一:前序遍历。

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    dfs(root, res);
    return res;
}

public void dfs(TreeNode root, List<Integer> res) {
    if (root == null) return;
    res.add(root.val);

    dfs(root.left, res);
    dfs(root.right, res);
}

递归的理解:先写出三个点的前序遍历,然后发现后面两个左右子树的if可以用dfs复用。

public void dfs(TreeNode root, List<Integer> res) {
    if (root == null) return;
    res.add(root.val);
        //  左边的坑:dfs(root.left, res);
        if (root.left == null) return;
        res.add(root.left.val);
        // 右边的坑:dfs(root.right, res);
        if (root.right == null) return;
        res.add(root.right.val);
}

栈:先push右边再push左边,保持左边元素永远在栈顶(第一个出栈),或者还有一种操作是当右边的入栈时先pop左边的点

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> res = new ArrayList<>();
    LinkedList<TreeNode> s = new LinkedList<>();
    if (root != null) s.push(root);

    while (!s.isEmpty()) {
        TreeNode node = s.pop();
        res.add(node.val);
        if (node.right != null) s.push(node.right);
        if (node.left != null) s.push(node.left);
    }
    return res;
}

results matching ""

    No results matching ""