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

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

问题

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

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

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

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

    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[] post, int postStart, int postEnd,
    int inStart, Map<Integer, Integer> inPos) {

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

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

}

 上一篇
二叉树的层序遍历 二叉树的层序遍历
二叉树的层序遍历问题 这个题目说的是,给你一棵二叉树,要求你从根节点到叶子节点一层一层地对其进行访问,对于每一层的节点,则是从左向右进行访问。将访问的结果以二维数组返回。 比如说,给你的二叉树是: 1 / \ 2
2018-12-28
下一篇 
二叉搜索树中查找数字 二叉搜索树中查找数字
二叉搜索树中查找数字问题 这个题目说的是,给你一棵二叉搜索树和一个数字,你要在二叉搜索树上找到这个数字,并返回它所在的节点。如果找不到这个数字,就返回空指针。 二叉搜索树的定义是: 1. 左子树所有节点上的值都小于根节点上的值 2
2018-12-28
  目录