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

来源:互联网 发布:行知实践园观后感400 编辑:程序博客网 时间:2024/05/16 09:17

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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