Recursive queries are done using a recursive common table expression in Postgres.
You can simulate Oracle's level by simply incrementing a value for each iteration and then comparing that in the outer query.
The leaf can be checked using a sub-query - similar to what MT0 did
The nocycle can be done by remembering all rows that have been processed and adding a where condition to the recursive part that stops if an employee was already processed.
By carrying the initial emp_id through all levels, you can also simulate Oracle's connect_by_root
with recursive cte (emp_id, mgr_id, name, path, level, visited, root_id) AS
(
select emp_id,
mgr_id,
name,
'/' || name,
1 as level,
array[emp_id] as visited,
emp_id as root_id
from employee e
where emp_id = 345
union all
select c.emp_id,
c.mgr_id,
c.name,
concat_ws('/', p.path, c.name),
p.level + 1,
p.visited || c.emp_id,
p.root_id
from employee c
join cte p on p.emp_id = c.mgr_id
where c.emp_id <> all(p.visited)
)
SELECT e.*,
not exists (select * from cte p where p.mgr_id = e.emp_id) as is_leaf
FROM cte e;
Online example: http://rextester.com/TSMVV17478