leetcode 105 从前序与中序遍历序列构造二叉树

161 阅读1分钟

解法:递归法

思路:根据前序列表的第0项可以得知二叉树的root,根据root可以找到中序遍历的里左右树的边界(前序【0】节点的元素),可以分别获得前序遍历的左右树和中序遍历的左右树。构造出当前节点的二叉树,递归知道前序遍历不在有值,返回null

var buildTree = function(preorder, inorder) {
    return deepTree(preorder, inorder)
};

// 递归构建每一个节点的树
function deepTree(preorder, inorder) {
        if (!preorder.length) return null
        // 跟节点
        let root = new TreeNode(preorder[0])
        
        // 从中序节点中找到root节点,划分左右树
        let p = 0
        while(inorder[p] !== preorder[0]) {
            p++
        }
        
        // 当前节点的中序左树
        let middleLeft = inorder.slice(0, p)
        // 当前节点的中序右树
        let middleRight = inorder.slice(p+1)
            
        // 当前节点的前序左树
        let preLeft = preorder.slice(1, p+1)
        // 当前节点的前序右树
        let preRight = preorder.slice(p+1)
        
        // 构建左树
        root.left = deepTree(preLeft, middleLeft)
        // 构建右树
        root.right = deepTree(preRight, middleRight)

        return root
    }