@XQF
2018-03-07T23:00:43.000000Z
字数 6080
阅读 1327
数据结构与算法
主要是依据中序求出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);
}
}