第八屆藍橋杯大賽個人賽決賽(軟體類)真題 -----Java大學C組------樹形顯示
阿新 • • 發佈:2019-01-30
標題:樹形顯示
對於分類結構可以用樹形來形象地表示。比如:檔案系統就是典型的例子。
樹中的結點具有父子關係。我們在顯示的時候,把子項向右縮排(用空格,不是tab),並新增必要的連線線,以使其層次關係更醒目。
下面的程式碼就是為了這個目的的,請仔細閱讀原始碼,並填寫劃線部分缺少的程式碼。
import java.util.*; class MyTree { private Map<String, List<String>> map_ch = new HashMap<String, List<String>>(); private Map<String,String> map_pa = new HashMap<String,String>(); public void add(String parent, String child) { map_pa.put(child, parent); List<String> lst = map_ch.get(parent); if(lst==null){ lst = new ArrayList<String>(); map_ch.put(parent, lst); } lst.add(child); } public String get_parent(String me){ return map_pa.get(me); } public List<String> get_child(String me){ return map_ch.get(me); } private String space(int n) { String s = ""; for(int i=0; i<n; i++) s += ' '; return s; } private boolean last_child(String x){ String pa = map_pa.get(x); if(pa==null) return true; List<String> lst = map_ch.get(pa); return lst.get(lst.size()-1).equals(x); } public void show(String x){ String s = "+--" + x; String pa = x; while(true){ pa = map_pa.get(pa); if(pa==null) break; s = ___________________________________ ; // 填空 } System.out.println(s); } public void dfs(String x){ show(x); List<String> lst = map_ch.get(x); if(lst==null) return; for(String it: lst){ dfs(it); } } } public class TreeView { public static void main(String[] args) { MyTree tree = new MyTree(); tree.add("root", "dog"); tree.add("root", "cat"); tree.add("root", "duck"); tree.add("dog", "AAdog"); tree.add("dog", "BBdog"); tree.add("dog", "CCdog"); tree.add("AAdog", "AAdog01"); tree.add("AAdog", "AAdog02"); tree.add("cat", "XXcat"); tree.add("cat", "YYcat"); tree.add("XXcat","XXcat-oo"); tree.add("XXcat","XXcat-qq"); tree.add("XXcat-qq", "XXcat-qq-hahah"); tree.add("duck", "TTduck"); tree.add("TTduck", "TTduck-001"); tree.add("TTduck", "TTduck-002"); tree.add("TTduck", "TTduck-003"); tree.add("YYcat","YYcat.hello"); tree.add("YYcat","YYcat.yes"); tree.add("YYcat","YYcat.me"); tree.dfs("root"); } }
對於題目中的測試資料,輸出結果:
+--root
+--dog
| +--AAdog
| | +--AAdog01
| | +--AAdog02
| +--BBdog
| +--CCdog
+--cat
| +--XXcat
| | +--XXcat-oo
| | +--XXcat-qq
| | +--XXcat-qq-hahah
| +--YYcat
| +--YYcat.hello
| +--YYcat.yes
| +--YYcat.me
+--duck
+--TTduck
+--TTduck-001
+--TTduck-002
+--TTduck-003
如有平字型對齊問題,可以參見圖【p1.png】
注意,只填寫劃線部分缺少的程式碼,不要抄寫已有的程式碼或符號。
last_child(pa)?""+space(pa.length()) +s:"|"+space(pa.length()) +s