用前序和中序遍历序列构建二叉树

用前序和中序遍历序列构建二叉树

问题

这个题目说的是,给你一棵二叉树的前序和中序遍历序列,你要根据这两个序列构建这棵二叉树。假设这棵二叉树节点上没有重复的数字。

比如说,给你的前序遍历序列和中序遍历序列分别是:

前序遍历序列:1, 2, 4, 8, 16
中序遍历序列:2, 1, 8, 4, 16

你要返回用它们构建出的二叉树,是:

    1
  /   \
 2     4
      / \
     8  16

代码

public class AlgoCasts {

  public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
      val = x;
    }
  }

  private TreeNode buildTree(
    int[] pre, int preStart, int preEnd,
    int inStart, Map<Integer, Integer> inPos) {

    if (preStart > preEnd) return null;
    TreeNode root = new TreeNode(pre[preStart]);
    int rootIdx = inPos.get(pre[preStart]);
    int leftLen = rootIdx - inStart;
    root.left = buildTree(pre, preStart+1, preStart+leftLen, inStart, inPos);
    root.right = buildTree(pre, preStart+leftLen+1, preEnd, rootIdx+1, inPos);
    return root;
  }

  // Time: O(n), Space: O(n)
  public TreeNode buildTree(int[] pre, int[] in) {
    Map<Integer, Integer> inPos = new HashMap<>();
    for (int i = 0; i < in.length; ++i)
      inPos.put(in[i], i);
    return buildTree(pre, 0, pre.length-1, 0, inPos);
  }

}

 上一篇
判断二叉树是否平衡 判断二叉树是否平衡
判断二叉树是否平衡问题 这个题目说的是,给你一棵二叉树,你要判断它是否平衡。这里平衡指的是,对于树上任意一个节点,它的两棵子树的高度差不能大于 1。 比如说,给你的二叉树是: 1 / \ 2 4
2018-12-28
下一篇 
二叉树的逆层序遍历 二叉树的逆层序遍历
二叉树的逆层序遍历问题 这个题目说的是,给你一棵二叉树,要求你从叶子节点到根节点一层一层地对其进行访问,对于每一层的节点,则是从左向右进行访问。将访问的结果以二维数组返回。 这道题目和二叉树层序遍历的唯一区别是,它是从下向上一层一层去访问的
2018-12-28
  目录