1. 程式人生 > >算法筆記_189:歷屆試題 橫向打印二叉樹(Java)

算法筆記_189:歷屆試題 橫向打印二叉樹(Java)

father 比較 fat color title 比對 temp ger 筆記

目錄

1 問題描述

2 解決方案


1 問題描述

問題描述

二叉樹可以用於排序。其原理很簡單:對於一個排序二叉樹添加新節點時,先與根節點比較,若小則交給左子樹繼續處理,否則交給右子樹。

當遇到空子樹時,則把該節點放入那個位置。

比如,10 8 5 7 12 4 的輸入順序,應該建成二叉樹如下圖所示,其中.表示空白。

...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

本題目要求:根據已知的數字,建立排序二叉樹,並在標準輸出中橫向打印該二叉樹。

輸入格式

輸入數據為一行空格分開的N個整數。 N<100,每個數字不超過10000。

輸入數據中沒有重復的數字。

輸出格式

輸出該排序二叉樹的橫向表示。為了便於評卷程序比對空格的數目,請把空格用句點代替:

樣例輸入1 10 5 20 樣例輸出1 ...|-20
10-|
...|-5 樣例輸入2 5 10 20 8 4 7 樣例輸出2 .......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4


2 解決方案

下面代碼詳解請見參考資料。

技術分享

具體代碼如下:

import java.util.Scanner;

public class Main {
    public static int root;
    
public static point[] tree = new point[10005]; static class point { public int value; //自身節點編號 public int father; //父母節點編號 public int left; //左孩子節點編號 public int right; //右孩子節點編號 public point() { this.value = 0; this.father = 0;
this.left = 0; this.right = 0; } } public void dfs(int start, String s, int n, String s1) { if(tree[start].value == root) s = s + tree[start].value; else { s = s + "-|-"; s = s + tree[start].value; } if(tree[start].right > 0) { s1 = s1 + "1"; dfs(tree[start].right, s, n + 1, s1); s1 = s1.substring(0, s1.length() - 1); } int len = s.length(); int cot = 0; for(int i = 0;i < len;i++) { if(s.charAt(i) == ‘|‘) { if(s1.length() <= cot + 1 || s1.charAt(cot) != s1.charAt(cot + 1)) System.out.print("|"); else System.out.print("."); cot++; } else if(cot < n) { System.out.print("."); } else { System.out.print(s.charAt(i)); } } if(tree[start].left > 0 || tree[start].right > 0) System.out.print("-|"); System.out.println(); if(tree[start].left > 0) { s1 = s1 + "0"; dfs(tree[start].left, s, n + 1, s1); s1 = s1.substring(0, s1.length() - 1); } } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); String A = in.nextLine(); String[] arrayA = A.split(" "); root = Integer.valueOf(arrayA[0]); for(int i = 0;i < tree.length;i++) tree[i] = new point(); for(int i = 0;i < arrayA.length;i++) { int a = Integer.valueOf(arrayA[i]); tree[a].value = a; } for(int i = 1;i < arrayA.length;i++) { int a = Integer.valueOf(arrayA[i]); int temp = root; while(true) { if(a > temp) { if(tree[temp].right == 0) { tree[temp].right = a; break; } else temp = tree[temp].right; } else { if(tree[temp].left == 0) { tree[temp].left = a; break; } else temp = tree[temp].left; } } } String s = ""; String s1 = ""; test.dfs(root, s, 0, s1); } }

參考資料:

1. 藍橋杯-歷屆試題-橫向打印二叉樹(遍歷樹+模擬)

算法筆記_189:歷屆試題 橫向打印二叉樹(Java)