思路
爲何先序+中序,或者中序+後序能夠創造一顆二叉樹?java
由於先序能夠知道這顆樹的根,後序也能夠知道這顆樹的根,那麼再去看中序,中序的根就找到了,中序根左邊的子樹是左子樹,中序根右邊的是右子樹,也就是說經過先序先肯定根,而後中序找到根與左右子樹,而後對左子樹遞歸找根,對右子樹遞歸找根,一直找不到爲止node
遞歸的思路是什麼呢?數組
以先序+中序舉例,先序先找到根,而後中序能夠劃分出左子樹+根+右子樹的形式,而後咱們能夠輕鬆拿到中序左子樹的數組和中序右子樹的數組,咱們知道根據一個樹的先序+中序能夠很快在中序中肯定根在哪,因此咱們如今已經有了中序的左子樹和右子樹,而且他們都是按照中序的規則,那先序的根的左子樹和右子樹序列在哪呢?依然在原先序序列中找,既然咱們已經在中序中找到了左子樹和右子樹序列,那麼在先序中就很容易找出,由於要知道先序序列知足前面是根,中間一部分是左子樹,最後一塊是右子樹的形式,中序知足最左邊一塊是左子樹,中間根,右邊右子樹,後序的話左邊是左子樹,中間右子樹,最後是根。
咱們經過對中序的左子樹遞歸找根,中序的右子樹遞歸找根,一直到結點爲 null 返回爲止ide
// 結點 class Node { int data; Node left = null; Node right = null; } // 二叉樹 public class BinaryTree { // 根結點 private Node root; // 輸入的數組 private int[] arr_in; // 輸出的數組 private int[] arr_out; // 記錄數組下標 private static int index; // 初始化 public BinaryTree(int[] arr) { root = new Node(); this.arr_in = arr; arr_out = new int[arr.length]; index = 0; } // 根據先序遍歷和中序遍歷建立二叉樹 public Node createByPreAndIn(int[] preArr, int[] inArr) { if (preArr.length > 0) { Node node = new Node(); node.data = preArr[0]; int i; for (i = 0; preArr[0] != inArr[i]; i++) ; // 中序左子樹 int[] leftInArr = new int[i]; // 中序右子樹 int[] rightInArr = new int[inArr.length - i - 1]; // 先序左子樹 int[] leftPreArr = new int[i]; // 先序右子樹 int[] rightPreArr = new int[inArr.length - i - 1]; System.arraycopy(inArr, 0, leftInArr, 0, leftInArr.length - 1); System.arraycopy(inArr, i + 1, rightInArr, 0, rightInArr.length - 1); System.arraycopy(preArr, 1, leftPreArr, 0, leftPreArr.length - 1); System.arraycopy(preArr, i + 1, rightInArr, 0, rightPreArr.length - 1); node.left = createByPreAndIn(leftPreArr, leftInArr); node.right = createByPreAndIn(rightPreArr, rightInArr); return node; } else return null; } // 根據中序遍歷和後序遍歷建立二叉樹 public Node createByInAndPost(int[] inArr, int[] postArr) { if (inArr.length > 0) { Node node = new Node(); node.data = postArr[postArr.length]; int i; for (i = 0; postArr[postArr.length] != inArr[i]; i++) ; // 中序左子樹 int[] leftInArr = new int[i]; // 中序右子樹 int[] rightInArr = new int[inArr.length - i - 1]; // 後序左子樹 int[] leftPostArr = new int[i]; // 後序右子樹 int[] rightPostArr = new int[inArr.length - i - 1]; System.arraycopy(inArr, 0, leftInArr, 0, leftInArr.length - 1); System.arraycopy(inArr, i + 1, rightInArr, 0, rightInArr.length - 1); System.arraycopy(postArr, 0, leftPostArr, 0, leftPostArr.length - 1); System.arraycopy(postArr, i, rightPostArr, 0, rightPostArr.length - 1); node.left = createByInAndPost(leftInArr, leftPostArr); node.right = createByInAndPost(rightInArr, rightPostArr); return node; } else return null; }