package com.coding.basic; import java.util.Queue; import java.util.LinkedList; /** * 由两种遍历结果确定二叉树(其中一个结果必须是中序遍历的结果) */ public class ReConstructBST{ /** * 前序遍历与中序遍历序列重建二叉树 * @param preOrder 前序结果 * @param inOrder 中序结果 * @return root元素 */ public static Node construct(int[] preOrder, int[] inOrder){ if(preOrder == null || inOrder == null || preOrder.length<=0||inOrder.length<=0) return null; return reConstruct(preOrder, 0 ,preOrder.length-1, inOrder,0, inOrder.length-1); } /** * * @param preOrder 前序序列 * @param ps 前序序列开始索引 * @param pe 前序序列结束索引 * @param inOrder 中序序列 * @param is 中序序列开始索引 * @param ie 中序序列结束索引 * @return 本次的根节点 */ private static Node reConstruct(int[] preOrder, int ps, int pe, int[] inOrder, int is, int ie){ int rootValue = preOrder[ps]; Node root = new Node(rootValue); //只有一个元素 if(ps == pe){ if(is == ie && preOrder[ps] == inOrder[is]){ return root; } throw new RuntimeException("输入错误!"); } //不止有一个元素,在中序遍历中找到根节点的位置 int rootIndexInOrder = is; while(rootIndexInOrder <= ie && inOrder[rootIndexInOrder]!=rootValue) rootIndexInOrder++; int lCTLengthInOrder = rootIndexInOrder - is; //左子树长度 int lCTEndIndexPreOrder = ps + lCTLengthInOrder; //左子树末尾节点在前序遍历序列中的位置 if(lCTLengthInOrder > 0){ //左子树有元素,构建左子树 root.left = reConstruct(preOrder, ps+1, lCTEndIndexPreOrder, inOrder, is, rootIndexInOrder-1); } if(lCTLengthInOrder < (pe-ps)){ //有字数有元素,构建右子树 root.right = reConstruct(preOrder, lCTEndIndexPreOrder+1, pe, inOrder, rootIndexInOrder+1, ie); } return root; } public static void printInPostOrder(Node n){ if(n.left != null){ printInPostOrder(n.left); } if(n.right != null){ printInPostOrder(n.right); } System.out.print(n.data+" "); } public static void traveralByLevel(Node n){ if(n == null) return; Queue<Node> queue = new LinkedList<Node>(); queue.offer(n); while(!queue.isEmpty()){ Node node = queue.poll(); System.out.print(node.data + " "); if(node.left != null) queue.offer(node.left); if(node.right != null) queue.offer(node.right); } } //节点 public static class Node{ int data; Node left; Node right; public Node(int data) { this.data = data; this.left = null; this.right = null; } } }