重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字

来源:互联网 发布:淘宝直播主播培训 编辑:程序博客网 时间:2024/05/21 10:39
/** *  * 树的结构 * */class BinaryTree{int data;BinaryTree left;BinaryTree right;}/** *  * 重建二叉树,输入某二叉树的前序遍历和中序遍历的结果,重建出二叉树,假设输入的前序和中序遍历结果中不含重复的数字 * */public class RebuildBiTree {/** *  * @param preorder  前序遍历结果 * @param inorder中序遍历结果 * @param rootIndex 根节点在前序遍历结果中的位置 * @param start子数序列在中序遍历结果中的起始位置 * @param end子数序列在中序遍历结果中的终止位置 * @param root      根节点 * @return返回数的根节点 */public BinaryTree rebuildTree(int[] preorder,int[] inorder,int rootIndex,int start,int end,BinaryTree root){if(preorder == null || inorder == null || preorder.length!=inorder.length || preorder.length == 0 || inorder.length == 0){return root;}root = new BinaryTree();root.data = preorder[rootIndex];//根节点在中序遍历结果中的位置int rootIndexInInorder = -1;for(int i = start;i <= end;i++){if(root.data == inorder[i]){rootIndexInInorder = i;break;}}//如果有左子树if(rootIndexInInorder - start >= 1 ){//rootIndex为在前序遍历结果中的位置root.left = rebuildTree(preorder,inorder,rootIndex+1,start,rootIndexInInorder-1,root.left);}//如果有右子树if(end - rootIndexInInorder >= 1 ){root.right = rebuildTree(preorder,inorder,rootIndex + rootIndexInInorder-start + 1,rootIndexInInorder+1,end,root.right);} return root;}//中序遍历public void inorder(BinaryTree root){if(root != null){inorder(root.left);System.out.println(root.data);inorder(root.right);}}public static void main(String[] args) {RebuildBiTree rbt = new RebuildBiTree();BinaryTree root = null;int[] preorder = {1,2,4,7,3,5,6,8};int[] inorder = {4,7,2,1,5,3,8,6};root = rbt.rebuildTree(preorder, inorder, 0, 0, preorder.length - 1, root);rbt.inorder(root);}}

原创粉丝点击