@XQF
2018-03-07T15:00:43.000000Z
字数 6080
阅读 1460
数据结构与算法
主要是依据中序求出offset,这个offset为了方便成了加上就能拿到索引那种
public void createTreeWithPreAndIn(int[] preOrder, int[] inOrder) {root = createTreeWithPreAndIn(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);}public TreeNode createTreeWithPreAndIn(int[] preOrder, int preLeft, int preRight, int[] inOrder, int inLeft, int inRight) {if (preLeft > preRight || inLeft > inRight) {return null;}int rootData = preOrder[preLeft];TreeNode root = new TreeNode(rootData);int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);int offset = rootIndexInInOrder - 1 - inLeft;TreeNode left = createTreeWithPreAndIn(preOrder, preLeft + 1, preLeft + 1 + offset, inOrder, inLeft, inLeft + offset);TreeNode right = createTreeWithPreAndIn(preOrder, preLeft + 1 + offset + 1, preRight, inOrder, rootIndexInInOrder + 1, inRight);root.left = left;root.right = right;return root;}
public void createTreeWithInAndPost(int[] inOrder, int[] postOrder) {root = createTreeWithInAndPost(inOrder, 0, inOrder.length - 1, postOrder, 0, postOrder.length - 1);}public TreeNode createTreeWithInAndPost(int[] inOrder, int inLeft, int inRight, int[] postOrder, int postLeft, int postRight) {if (inLeft > inRight || postLeft > postRight) {return null;}int rootData = postOrder[postRight];TreeNode root = new TreeNode(rootData);int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);int offset = rootIndexInInOrder - 1 - inLeft;TreeNode left = createTreeWithInAndPost(inOrder, inLeft, inLeft + offset, postOrder, postLeft, postLeft + offset);TreeNode right = createTreeWithInAndPost(inOrder, rootIndexInInOrder + 1, inRight, postOrder, postLeft + offset + 1, postRight - 1);root.left = left;root.right = right;return root;}
貌似不能根据前序和后序求出中序,因为,。,没办法确定左右子树的界限。
public int findRootIndex(int[] inOrder, int leftIn, int rightIn, int target) {int result = -1;for (int i = leftIn; i <= rightIn; i++) {if (inOrder[i] == target) {result = i;break;}}return result;}
class TreeNode {int data;TreeNode left;TreeNode right;public TreeNode(int data) {this.data = data;this.left = null;this.right = null;}}class BinaryTree {TreeNode root;public BinaryTree() {root = null;}public void insert(int data) {TreeNode node = new TreeNode(data);if (root == null) {root = node;} else {TreeNode dummy = root;while (true) {if (node.data < dummy.data) {if (dummy.left == null) {dummy.left = node;return;}dummy = dummy.left;} else {if (dummy.right == null) {dummy.right = node;return;}dummy = dummy.right;}}}}public TreeNode create(int[] datas) {for (int i = 0; i < datas.length; i++) {insert(datas[i]);}return root;}public void inOrder(TreeNode root) {if (root != null) {inOrder(root.left);System.out.print(root.data + " ");inOrder(root.right);}}public void preOrder(TreeNode root) {if (root != null) {System.out.print(root.data + " ");preOrder(root.left);preOrder(root.right);}}public void postOrder(TreeNode root) {if (root != null) {postOrder(root.left);postOrder(root.right);System.out.print(root.data + " ");}}public void bfs(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode current = queue.poll();if (current.left != null) {queue.add(current.left);}if (current.right != null) {queue.add(current.right);}System.out.print(" " + current.data);}}public void initTree(int[] preOrder, int[] inOrder) {this.root = this.initTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);}public TreeNode initTree(int[] preOrder, int leftPre, int rightPre, int[] inOrder, int leftIn, int rightIn) {if (leftPre > rightPre || leftIn > rightIn) {return null;}int rootData = preOrder[leftPre];TreeNode root = new TreeNode(rootData);int rootIndexInOrder = findRootIndex(inOrder, leftIn, rightIn, rootData);int offset = rootIndexInOrder - 1 - leftIn;TreeNode left = initTree(preOrder, leftPre + 1, leftPre + 1 + offset, inOrder, leftIn, leftIn + offset);TreeNode right = initTree(preOrder, leftPre + offset + 2, rightPre, inOrder, rootIndexInOrder + 1, rightIn);root.left = left;root.right = right;return root;}public void createTreeWithPreAndIn(int[] preOrder, int[] inOrder) {root = createTreeWithPreAndIn(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);}public TreeNode createTreeWithPreAndIn(int[] preOrder, int preLeft, int preRight, int[] inOrder, int inLeft, int inRight) {if (preLeft > preRight || inLeft > inRight) {return null;}int rootData = preOrder[preLeft];TreeNode root = new TreeNode(rootData);int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);int offset = rootIndexInInOrder - 1 - inLeft;TreeNode left = createTreeWithPreAndIn(preOrder, preLeft + 1, preLeft + 1 + offset, inOrder, inLeft, inLeft + offset);TreeNode right = createTreeWithPreAndIn(preOrder, preLeft + 1 + offset + 1, preRight, inOrder, rootIndexInInOrder + 1, inRight);root.left = left;root.right = right;return root;}public void createTreeWithPreAndPost(int[] preOrder, int[] postOrder) {}public void createTreeWithInAndPost(int[] inOrder, int[] postOrder) {root = createTreeWithInAndPost(inOrder, 0, inOrder.length - 1, postOrder, 0, postOrder.length - 1);}public TreeNode createTreeWithInAndPost(int[] inOrder, int inLeft, int inRight, int[] postOrder, int postLeft, int postRight) {if (inLeft > inRight || postLeft > postRight) {return null;}int rootData = postOrder[postRight];TreeNode root = new TreeNode(rootData);int rootIndexInInOrder = findRootIndex(inOrder, inLeft, inRight, rootData);int offset = rootIndexInInOrder - 1 - inLeft;TreeNode left = createTreeWithInAndPost(inOrder, inLeft, inLeft + offset, postOrder, postLeft, postLeft + offset);TreeNode right = createTreeWithInAndPost(inOrder, rootIndexInInOrder + 1, inRight, postOrder, postLeft + offset + 1, postRight - 1);root.left = left;root.right = right;return root;}public int findRootIndex(int[] inOrder, int leftIn, int rightIn, int target) {int result = -1;for (int i = leftIn; i <= rightIn; i++) {if (inOrder[i] == target) {result = i;break;}}return result;}}public class Solution {public static void main(String[] args) {BinaryTree tree = new BinaryTree();int[] nums = {1, 3, 4, 5, 6, 4, 3, 2};System.out.print("中序:");TreeNode root = tree.create(nums);tree.inOrder(root);System.out.println();System.out.print("先序:");tree.preOrder(root);System.out.println();System.out.print("后序:");tree.postOrder(root);System.out.println();System.out.print("层序:");tree.bfs(root);System.out.println();BinaryTree tree1 = new BinaryTree();int[] preOrder = {1, 2, 4, 8, 9, 5, 10, 3, 6, 7};int[] inOrder = {8, 4, 9, 2, 10, 5, 1, 6, 3, 7};// ? tree1.initTree(preOrder, inOrder);tree1.createTreeWithPreAndIn(preOrder, inOrder);System.out.print("后序:");tree1.postOrder(tree1.root);}}