zoukankan      html  css  js  c++  java
  • 105. Construct Binary Tree from Preorder and Inorder Traversal

    分治法后序遍历建树

    对数组, 输入值为数组(起始点和终止点控制数组的长度和节点的值---去掉用过的点的位置) :

    1递归出口,   if (prestart > preend || instart > inend) return null;

    2构造节点, 根据数组的某个位置

    3操作数组的长度, 起始点和终止点--> 为了下一个节点

    4分治法建立子节点关系, 改变输入值的数组的起始点和终止点(控制数组的长度和节点的值---去掉用过的点的位置) :

    5后序遍历返回root

    public TreeNode buildTree(int[] preorder, int[] inorder) {
            Map<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < inorder.length; i++) {
                map.put(inorder[i], i);
            }
            return help(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1, map);
        }
        private TreeNode help(int[] preorder, int[] inorder, 
                              int prestart, int preend, int instart, int inend, Map map){
            if (prestart > preend || instart > inend) return null;
            TreeNode root = new TreeNode(preorder[prestart]);
            int pos = (int)map.get(root.val);
            int gap = pos - instart;
            root.left = help(preorder, inorder, prestart + 1, prestart + gap, instart, pos - 1, map);
            root.right = help(preorder, inorder, prestart + 1 + gap, preend, pos + 1, inend, map);
            return root;
        }
    }
    

    围绕构建节点值, 和递归的输入值的起始点和终止点上面

  • 相关阅读:
    Eclipse 的单步调试
    CALayer快速入门
    UITableView快速入门
    iOS程序启动原理
    iOS触摸事件
    UITableViewCell重用和性能优化
    Autolayout
    iOS适配
    NSTimer
    UIScrollView
  • 原文地址:https://www.cnblogs.com/apanda009/p/7270347.html
Copyright © 2011-2022 走看看