每日刷题 day11---重建二叉树(已知中序和前序)

101 阅读1分钟

leetcode传送门

image.png 思路:

 首先 前序遍历 是 根节点->左节点->右节点
      中序遍历 是 左节点->根节点->右节点
 因此 我们前序遍历的第一个节点是根节点(root node),因为题目中说了不会有重复的数字,
 所以我们可以通过 root node节点在中序遍历中的索引(index),
 其中对于中序遍历来说,(0index-1)都是左子树,(index+1, length-1)都是右子树
 对于前序遍历来说,(1,中序遍历左子树的长度) 都是左子树,(中序遍历左子树的长度+1,...) 都是右子树.
 此时我们就可以递归寻找左子树的根节点 和 右子树的根节点 直到子树的长度==1的时候,该节点就是叶子节点    
     function resTree(pre,middle){
        let result = null
        if(pre.length > 1){
            let root = pre[0]
            let index = middle.indexOf(root)
            let middleLeft = middle.slice(0,index)
            let middleRight = middle.slice(index+1)
            pre.shift()
            let preLeft = pre.slice(0,middleLeft.length)
            let preRight = pre.slice(middleLeft.length)
            result = {
                val:root,
                left: resTree(preLeft,middleLeft),
                right:resTree(preRight,middleRight)
            }
        }else if(pre.length === 1){
            result = {
                val:pre[0],
                left:null,
                right:null
            }
        }
        return result

     }