📖
Data Structure
  • 基本概念
  • 线性表
    • 顺序表
    • 链表
    • 广义表
  • 栈
  • 队列
  • 字符串
  • 树
    • 二叉树
    • 二叉搜索树
    • 平衡二叉树
    • 堆
    • 哈夫曼树
  • 图
    • DFS
    • BFS
  • 排序
    • 选择排序
    • 插入排序
    • 比较选择排序和插入排序
    • 希尔排序
  • 常用算法
    • 排序
    • 二叉树遍历
    • 根据两种遍历顺序重构树
    • 二叉树深度
    • 最近公共祖先
    • 回溯集合
    • N Sum
    • union-find
  • 常用算法时间复杂度速查表
由 GitBook 提供支持
在本页
  • 1. 先序 + 中序
  • 2. 中序 + 后序
  • 3. 先序 + 后序
  • 4. 先序 + 二叉搜索树

这有帮助吗?

  1. 常用算法

根据两种遍历顺序重构树

1. 先序 + 中序

public TreeNode buildTree(int[] preorder, int[] inorder) {
    
    if (preorder == null || inorder == null || preorder.length != inorder.length) return null;
    
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < inorder.length; i++) map.put(inorder[i], i);
    
    return helper(preorder, 0, preorder.length - 1, map, 0, inorder.length - 1);
    
}

private TreeNode helper(int[] preorder, int pb, int pe, Map<Integer, Integer> map, int ib, int ie) {
    
    if (pb > pe || ib > ie) return null;
    
    TreeNode root = new TreeNode(preorder[pb]);
    int ci = map.get(preorder[pb]);
    
    root.left = helper(preorder, pb + 1, pb + ci - ib, map, ib, ci - 1);
    root.right = helper(preorder, pb + ci -ib + 1, pe, map, ci + 1, ie);
    
    return root;
    
}

2. 中序 + 后序

public TreeNode buildTree(int[] inorder, int[] postorder) {

    if (inorder == null || postorder == null || inorder.length != postorder.length) return null;

    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < inorder.length; i++) map.put(inorder[i], i);

    return helper(map, 0, inorder.length - 1, postorder, 0, postorder.length - 1);

}

private TreeNode helper(Map<Integer, Integer> map, int ib, int ie, int[] postorder, int pb, int pe) {

    if (ib > ie || pb > pe) return null;

    TreeNode root = new TreeNode(postorder[pe]);
    int ci = map.get(postorder[pe]);

    root.left = helper(map, ib, ci - 1, postorder, pb, pe - ie + ci - 1);
    root.right = helper(map, ci + 1, ie, postorder, pe - ie + ci, pe - 1);

    return root;

}

3. 先序 + 后序

4. 先序 + 二叉搜索树

上一页二叉树遍历下一页二叉树深度

最后更新于4年前

这有帮助吗?