剑指offer之编程(四)

来源:互联网 发布:vocaloid软件百度云 编辑:程序博客网 时间:2024/07/17 20:33

题目描述:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回后续遍历。

思路:很典型的知道前序和中序求整个二叉树的题目,首先看前序遍历,根据前序遍历的规则可以知道,第一个元素时二叉树的根节点,其他的元素则为子数的根节点。通过前序遍历的节点,在中序遍历中找到该节点,那么,这个节点的左边就是这棵树的左子树,右边是这棵树的右子树。例如:前序遍历的第一个元素为1,那么在中序遍历中找到1,那么这棵树的左子树的元素为{4,7,2},右子树的元素为{5,3,8,6},那么下面就可以递归地求解各个子树了,例如对于左子树{4,7,2},在前序遍历中按次序找到2,那么这可子树的左子树是{4,7},右子树为{},即为空。按照这种方法递归地找下去,那么就可以建立一个二叉树。下面的代码是输出后序遍历的代码,层次输出的话修改一下输出语句。


代码如下:

import java.util.*;public class Main10 {public static void main(String[] args) {int[] pre = {1,2,4,7,3,5,6,8};        int[] in = {4,7,2,1,5,3,8,6};        solve(pre, in);}public static void solve(int []pre,int []in)  //pre为前序遍历,in为中序遍历{if(pre.length<1)  //没有元素就返回{return;}else if(pre.length==1)  //只有一个元素{System.out.println(pre[0]);  //输出这个元素}else{//在中序中找到当前根节点位置int index = 0;for(int i=0;i<in.length;i++){if(pre[0]==in[i]){index = i;}}//左半部分的前序int [] leftPre = new int[index];System.arraycopy(pre, 1, leftPre, 0, index);//右半部分的前序int len = pre.length-index-1;int [] rightPre = new int[len];System.arraycopy(pre, index+1, rightPre, 0, len);//左边部分的中序int [] leftIn = new int[index];System.arraycopy(in, 0, leftIn, 0, index);//左半部分的中序int rlen = in.length-index-1;int [] rightIn = new int[rlen];System.arraycopy(in, index+1, rightIn, 0, rlen);//递归地求解左右子树solve(leftPre, leftIn);solve(rightPre, rightIn);System.out.println(pre[0]);  //输出根}}}class TreeNode  //树节点的类{int data;TreeNode leftNode;TreeNode rightNode;public TreeNode(int data){this.data = data;}}

可能还有其他比较好的方法,还望不惜吝教。

本人经验,仅供参考!

0 0
原创粉丝点击