《剑指Offer》 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
个人分析:
1 通过前序遍历拿到二叉树的根节点
 2 找到根节点在中序遍历中的位置,确定二叉树的左右子树节点
3  通过遍历确定左右各子树的前序遍历和中序遍历
4  递归  重复上述步骤
public class Demo {
	  public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
		 
		  // 递归出口
		  if(pre.length == 0 || in.length == 0 || pre.length != in.length) {
			  return null;
		  }
		  // 拿到根结点
		  TreeNode root = new TreeNode(pre[0]);
		  
		  // 找的根结点在中序遍历中的位置
		  int i = 0;
		  while(in[i] != root.val) {
			  i++;
		  }
		  //确定左子树前序遍历长度
		  int[] preLeft = new int[i];
		  //确定左子树中序遍历长度
		  int[] inLeft = new int[i];
		
		  //确定右子树前序遍历长度
		  int[] preRight = new int[in.length - i -1];
		  //确定右子树中序遍历长度
		  int[] inRight = new int[in.length - i -1];
		   
		  // 遍历 依次拿到左右子树  前中序遍历的值
		  for(int j = 0 ; j<in.length ;j++) {
			  if(j < i) {
				  preLeft[j] = pre[j+1];
				  inLeft[j] = in[j];
			  }else if(j > i) {
				  preRight[j-i-1] = pre[j];
				  inRight[j-i-1] = in[j];
			  }
		  }
		  // 递归
		  root.left = reConstructBinaryTree(preLeft,inLeft);
		  root.right = reConstructBinaryTree(preRight,inRight);
		  return root;
	  }
	  //后序遍历
	  public static void last(TreeNode tr) {
		  if(tr == null) {
			  return ;
		  }
		  
		 last(tr.left);
		 last(tr.right);
		 System.out.print(tr.val +" ");
	  }
	  
	  public static void main(String[] args) {
		  	int[] a = {1,2,4,7,3,5,6,8};
		    int[] b = {4,7,2,1,5,3,8,6};
		    TreeNode root = reConstructBinaryTree(a,b);
		    last(root);
	  }
}

class TreeNode {
  	int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值