剑指offer_7_重建二叉树

  • 2019 年 10 月 7 日
  • 筆記

题目:重建二叉树

描述:

输入某二叉树的前序遍历和中序遍历的结果,请重新构建该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{5,2,1,7,6,9}和中序遍历为{1,2,5,6,7,9},则重建出二叉树并输出它的头结点。

思路:利用前序遍历根节点左右俩侧是左右子树,中序遍历第一个节点就根节点的特性,将一棵树细分成很多子树,从根节点往下构造。

Map<Integer,Integer> map = new HashMap<>();    public TreeNode fill(int[] pre,int[] in) {      for (int i = 0; i < in.length; i++) {          map.put(in[i],i);      }      return reBuild(pre,0,pre.length -1,0);  }      // pre[] 前序遍历 preL:当前前序遍历数组的最左侧 preR:当前前序遍历数组的最右侧 inL中序遍历的最左侧  public TreeNode reBuild(int[] pre,int preL,int preR,int inL) {       if (preL > preR) {           return null;       }      TreeNode root = new TreeNode(pre[preL]);       // 得到该节点的下标       int inIndex = map.get(root.value);       // 左子树的大小       int lTreeSize = inIndex - inL;       // 递归左边的子树       root.left = reBuild(pre,preL + 1,preL + lTreeSize,inL);       // 递归右边的子树 inL + lTreeSize + 1:当前中序遍历数组的最左侧元素       root.right = reBuild(pre,preL + lTreeSize + 1,preR,inL + lTreeSize + 1);      return root;   }  }    class TreeNode {      TreeNode left;      TreeNode right;      int value;      public TreeNode(int value) {          this.value = value;      }  }

利用前序后续遍历的特性,重新构建二叉树。