劍指 Offer 07. 重建二叉樹
阿新 • • 發佈:2020-06-29
import java.util.LinkedList; /** * @Class BuildTree * @Description 劍指 Offer 07. 重建二叉樹 * 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。 * 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 * <p> * 例如,給出 * 前序遍歷 preorder = [3,9,[10,11],20,15,7] * 中序遍歷 inorder = [10,9,11,3,15,20,7] * 返回如下的二叉樹: * 3 * / \ * 9 20 * / \ / \ * 10 11 15 7 * <p> * 限制: * 0 <= 節點個數 <= 5000 * @Author * @Date 2020/6/28 **/ public class BuildTree { static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } }
// 利用遞迴 public static TreeNode buildTree(int[] preorder, int[] inorder) { if (preorder == null || inorder == null) { return null; } if (preorder.length == 1 && inorder.length == 1) { return new TreeNode(preorder[0]); } TreeNode treeNode = buildTree(preorder, 0, inorder, 0, inorder.length - 1); return treeNode; } private static TreeNode buildTree(int[] preorder, int rootIndex, int[] inorder, int start, int end) { // 終止條件 if (preorder == null || inorder == null || start > end || start >= inorder.length) { return null; } int index = start; for (; index <= end; index++) { if (inorder[index] == preorder[rootIndex]) break; } TreeNode treeNode = new TreeNode(preorder[rootIndex]); // rootIndex++ 會導致遞迴記憶體溢位,x++與++x的區別 // 左子樹的範圍是inorder[start,index-1];,左子節點是preorder[++rootIndex] // 右子樹的範圍是inorder[index+1,end];右子節點是preorder[rootIndex + index - start] treeNode.left = buildTree(preorder, ++rootIndex, inorder, start, index - 1); treeNode.right = buildTree(preorder, rootIndex + index - start, inorder, index + 1, end); return treeNode; }
/** * 解法2:利用遞迴 */ public static int[] reversePrint(ListNode head) { LinkedList<Integer> linkedList = new LinkedList<>(); reversePrint(head,linkedList); int size = linkedList.size(); int[] ans = new int[size]; for (int i = 0; i < size; i++) { ans[i]= linkedList.pop(); } return ans; } private static LinkedList<Integer> reversePrint(ListNode listNode, LinkedList linkedList){ if(listNode==null) return null; linkedList.add(listNode.val); return reversePrint(listNode.next,linkedList); }
// 測試用例
public static void print(TreeNode treeNode, LinkedList linkedList) {
if (treeNode == null) return;
print(treeNode.left, linkedList);
print(treeNode.right, linkedList);
linkedList.add(treeNode.val);
}
public static void main(String[] args) {
int[] preorder = new int[]{3, 9, 20, 15, 7};
int[] inorder = new int[]{9, 3, 15, 20, 7};
TreeNode treeNode = buildTree(preorder, inorder);
LinkedList linkedList = new LinkedList();
print(treeNode, linkedList);
System.out.println("demo01 result:");
for (int i = 0; i < linkedList.size(); i++) {
System.out.print(" " + linkedList.get(i));
}
System.out.println("");
preorder = new int[]{1,2,3};
inorder = new int[]{3,2,1};
treeNode = buildTree(preorder, inorder);
linkedList = new LinkedList();
print(treeNode, linkedList);
System.out.println("demo02 result:");
for (int i = 0; i < linkedList.size(); i++) {
System.out.print(" " + linkedList.get(i));
}
System.out.println("");
}