次のようなものが必要です:
select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name
from user_tables t
join user_constraints c1
on (t.table_name = c1.table_name
and c1.constraint_type in ('U', 'P'))
left join user_constraints c2
on (t.table_name = c2.table_name
and c2.constraint_type='R')
start with t.table_name = 'ROOT_TAB'
connect by prior c1.constraint_name = c2.r_constraint_name
元のクエリの問題は、子テーブルのuc.constraint_nameが外部キーの名前であるということです。これは、最初の子をルートテーブルに接続する場合は問題ありませんが、2番目のレベルの子を最初のレベルに接続するために必要なものではありません。そのため、制約に対して2回結合する必要があります。1回はテーブルの主キーを取得するため、もう1回は外部キーを取得するためです。
余談ですが、user_*ビューではなくall_*ビューをクエリする場合は、通常、table_nameだけでなく、table_nameとownerでそれらを結合する必要があります。複数のスキーマに同じ名前のテーブルがある場合、table_nameだけで結合すると、誤った結果が得られます。