剑指Offer--我用JAVA做(三)

来源:互联网 发布:做广告牌的软件 编辑:程序博客网 时间:2024/06/01 10:51
/** * 题目描述: * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。 * 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 * 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。  * @author zonebase@163.com */public class day04 {public static void main(String[] args) { int preOrder[] ={1,2,4,7,3,5,6,8}; int inOrder[]={4,7,2,1,5,3,8,6};  BinaryTreeNode root=reConstructTree(preOrder,inOrder); System.out.println("先序输出:"); printPre(root); System.out.println(); System.out.println("中序输出:"); printIn(root); System.out.println(); System.out.println("后序输出:"); printBe(root); }private static BinaryTreeNode reConstructTree(int preOrder[], int inOrder[]){//前序的第一个节点就是根节点BinaryTreeNode root=new BinaryTreeNode(preOrder[0]);//中序  被根节点分隔,左侧为左节点右侧为右节点int leftNum=0;for(int i=0;i<inOrder.length;i++){if(root.getValue()==inOrder[i]){leftNum=i;break;}}int rightNum=preOrder.length-leftNum-1;if(leftNum>0){//把左侧节点看成新的二叉树前序和中序int newPreOrder[] =new int[leftNum];int newInOrder[] =new int[leftNum];for(int i=0;i<leftNum;i++){newPreOrder[i]=preOrder[i+1];newInOrder[i]=inOrder[i];}//进行递归构造root.setLeft(reConstructTree(newPreOrder,newInOrder));}if(rightNum>0){//把右侧节点看成新的二叉树前序和中序int newPreOrder[] =new int[rightNum];int newInOrder[] =new int[rightNum];for(int i=0;i<rightNum;i++){newPreOrder[i]=preOrder[inOrder.length-rightNum+i];newInOrder[i]=inOrder[inOrder.length-rightNum+i];}//进行递归构造root.setRight(reConstructTree(newPreOrder,newInOrder));}return root;}/** * 先序输出 * @param tree */private static void printPre(BinaryTreeNode tree){if(tree!=null){System.out.print(tree.getValue()+"  ");printPre(tree.getLeft());printPre(tree.getRight());}}/** * 中序输出 * @param tree */private static void printIn(BinaryTreeNode tree){if(tree!=null){printIn(tree.getLeft());System.out.print(tree.getValue()+"  ");printIn(tree.getRight());}}/** * 后序输出 * @param tree */private static void printBe(BinaryTreeNode tree){if(tree!=null){printBe(tree.getLeft());printBe(tree.getRight());System.out.print(tree.getValue()+"  ");}}}/** * 二叉树节点类定义 * * @author zonebase@163.com * @date 2017年6月8日 下午4:46:12 */class BinaryTreeNode {      private int value;      private BinaryTreeNode left;      private BinaryTreeNode right;        public BinaryTreeNode(int value) {          this.value = value;      }        public BinaryTreeNode(int value, BinaryTreeNode left, BinaryTreeNode right) {          this.value = value;          this.left = left;          this.right = right;      }        public int getValue() {          return value;      }        public void setValue(int value) {          this.value = value;      }        public BinaryTreeNode getLeft() {          return left;      }        public void setLeft(BinaryTreeNode left) {          this.left = left;      }        public BinaryTreeNode getRight() {          return right;      }        public void setRight(BinaryTreeNode right) {          this.right = right;      }    }