You can find fragmented table using below query
SQL> select table_name,round((blocks*8),2)/1024 "size (mb)" ,
round((num_rows*avg_row_len/1024/1024),2) "actual_data (mb)",
(round((blocks*8),2) - round((num_rows*avg_row_len/1024/1024),2)) "wasted_space (mb)"
from dba_tables
where (round((blocks*8),2) > round((num_rows*avg_row_len/1024/1024),2))
order by 4 desc;
And Use below for find fragmented Index.
1. Execute below
SQL> ANALYZE INDEX index_name VALIDATE STRUCTURE;
Once above done you can get index analyze report in report from INDEX_STATS table using below query.
SQL> SELECT name,height,lf_rows,lf_blks,lf_rows_len,lf_blk_len,del_lf_rows,distinct_keys,used_space/1024/1024 used_space
FROM INDEX_STATS;
This INDEX_STATS table contain only 1 row. so to get multiple indexs report you have to run one by one and get report after each run.