筆試-2020年西山居Java筆試題(補上,一直忘記補上了)
阿新 • • 發佈:2021-01-19
2020年西山居Java筆試題
當初參加西山居時候第一道演算法題,一直想做來著,給耽誤了,補上
給定一個二叉樹的前序遍歷和中序遍歷的序列,輸出對應這個二叉樹的後續遍歷序列。
輸入描述:
輸入為一行。
兩個字串,分別表示二叉樹的前序遍歷和中序遍歷結果,用空格分隔。保證資料合法
輸出描述:
對應輸出後序遍歷序列
示例1
輸入
ABDEC DBEAC
輸出
DEBCA
思路:先根據先序、中序序列建立二叉樹,然後後序遍歷
package 雜題彙總; import java.util.Scanner; /** * @author :Empirefree * @description:TODO * @date :2021/1/19 10:25 */ public class PreAndMid { public static class TreeNode { char val; TreeNode left; TreeNode right; TreeNode(char x) { val = x; } } /* * 2020年西山居Java筆試題--先序中序構建二叉樹並求後序 * * Case:ABDEC DBEAC 輸出:DEBCA * */ //TODO:陣列傳遞,類傳遞 //TODO:static final public static TreeNode createTreeNode(char[] preChar, int preStart, int preEnd, char[] midChar, int midStart, int midEnd){ if (preStart >= preEnd || midStart >= midEnd) return null; TreeNode rootNode = new TreeNode(preChar[preStart]); for (int i = midStart; i < midEnd; i++) { if (preChar[preStart] == midChar[i]){ int midPreLen = i - midStart; rootNode.left = createTreeNode(preChar, preStart + 1, preStart + 1 + midPreLen, midChar, midStart, i); rootNode.right = createTreeNode(preChar, preStart + 1 + midPreLen, preEnd, midChar, i + 1, midEnd); } } return rootNode; } public static void postTravel(TreeNode rootTree){ if (rootTree != null){ postTravel(rootTree.left); postTravel(rootTree.right); System.out.print(rootTree.val); } } public static void main(String[] args) { //1、資料輸入 final Scanner scanner = new Scanner(System.in); char[] preChar = scanner.nextLine().toCharArray(); char[] midChar = scanner.nextLine().toCharArray(); //2、構建二叉樹 TreeNode rootTree = createTreeNode(preChar, 0, preChar.length, midChar, 0, midChar.length); //3、後序輸出 postTravel(rootTree); } }