假设是1000个结点以内,
输入前序 4 1 3 2 6 5 7
中序 1 2 3 4 5 6 7
得到后续 2 3 1 5 7 6 4
已知前序遍历中序遍历求后序遍历:
importjava.io.BufferedInputStream; importjava.util.Scanner; classNode { intdata; Nodeleft, right; } publicclassMain { publicstaticint[] pre=newint[1001]; publicstaticint[] in=newint[1001]; publicstaticvoidmain(String[] args) { Scannercin=newScanner(newBufferedInputStream(System.in)); intn=cin.nextInt(); for (inti=0; i<n; ++i) { pre[i] =cin.nextInt(); } for (inti=0; i<n; ++i) { in[i] =cin.nextInt(); } cin.close(); Nodehead=createTree(pre, 0, in, 0, n); postTraverse(head); } publicstaticvoidpostTraverse(Nodenode) { if (node==null) return; postTraverse(node.left); postTraverse(node.right); System.out.print(node.data+" "); } // 已知先序中序,建树// @param pre 先序遍历的数组// @param lo 先序遍历的起点下标// @param in 中序遍历的数组// @param ini 中序遍历的起点下标// @param n 这个树的结点个数publicstaticNodecreateTree(int[] pre, intlo, int[] in, intini, intn) { if (n<=0) { returnnull; } Nodenode=newNode(); node.data=pre[lo]; inti; for (i=0; i<n; ++i) { if (pre[lo] ==in[ini+i]) // 寻找到该树的根节点就又可以划分左右子树查找了break; } node.left=createTree(pre, lo+1, in, ini, i); // 左区间node.right=createTree(pre, lo+i+1, in, ini+i+1, n-i-1); // 右区间// 最后一个参数是这个子树的有多少结点returnnode; } }
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
练习题地址:
AC代码:
/*** Definition for binary tree* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/publicclassSolution { publicTreeNodereConstructBinaryTree(int[] pre, int[] in) { returnreConstructBinaryTree1(pre, 0, in, 0, in.length); } privateTreeNodereConstructBinaryTree1(int[] pre, intlo, int[] in, intini, intn) { if (n<=0) returnnull; TreeNodenode=newTreeNode(pre[lo]); inti; for (i=0; i<n; ++i) { if (pre[lo] ==in[ini+i]) break; } node.left=reConstructBinaryTree1(pre, lo+1, in, ini, i); node.right=reConstructBinaryTree1(pre, lo+i+1, in, ini+i+1, n-i-1); returnnode; } }
=====================Talk is cheap, show me the code=======================