重建二叉树 剑指offer

4 篇文章 0 订阅
1 篇文章 0 订阅
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
import java.util.Scanner;

public class Solution {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Solution solution = new Solution();
//		int[] pre= {1,2,4,7,3,5,6,8};
//		int[] in = {4,7,2,1,5,3,8,6};
		Scanner s = new Scanner(System.in);
		while(s.hasNextLine()){
			String string1 = s.nextLine();
			String string2 = s.nextLine();
			String[] strArr1 = string1.split(",");
			String[] strArr2 = string2.split(",");
			int[] pre = new int[strArr1.length];
			int[] in = new int[strArr2.length];
			for(int i=0; i<pre.length; i++){
				pre[i] = Integer.parseInt(strArr1[i]);
				in[i] = Integer.parseInt(strArr2[i]);
			}
			TreeNode root = solution.reConstructBinaryTree(pre, in);
			System.out.print(root.value);System.out.print(root.left.value);System.out.print(root.right.value);
			System.out.print(root.left.left.value);System.out.print(root.left.left.right.value);
		}
		

	}
	 public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
		 	if(pre.length==0){
		 		return null;
		 	}
	        TreeNode root = new TreeNode();
	        root.value = pre[0];
	        int sep = 0;
	        for(int i=0; i<in.length; i++){//求中序的分割点,即根结点位置
	        	if(in[i]==pre[0]){
	        		sep = i;
	        		break;
	        	}
	        }
	        int[] pre1 = new int[sep];
	        int[] in1 = new int[sep];
	        for(int i=1; i<sep+1; i++){//求前序
	        	pre1[i-1] = pre[i];
	        }
	        for(int i=0; i<sep; i++){//求中序
	        	in1[i] = in[i];
	        }
	        root.left = reConstructBinaryTree(pre1, in1);
	        //右子树
	        int[] pre2 = new int[pre.length-sep-1];
	        int[] in2 = new int[pre2.length];
	        for(int i=sep+1; i<pre.length; i++){
	        	pre2[i-sep-1] = pre[i];
	        }
	        for(int i=sep+1; i<in.length; i++){
	        	in2[i-sep-1] = in[i];
	        }
	        root.right = reConstructBinaryTree(pre2, in2);
	        return root;
	 }
}
class TreeNode{
	int value;
	TreeNode left;
	TreeNode right;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值