代码随想录的第十三天(二叉树)

81 阅读3分钟

代码随想录的第十三天(二叉树)

思路:

1、层序遍历整体思路就是,模拟一个队列

2、记录队列的长度,因为后续需要对队列里面的每个值都进行遍历

3、将队列中的首个值抛出,然后去查看他有没有左右子树,有的话就塞进来,以此类推

102. 二叉树的层序遍历

var levelOrder = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.left) {
                stack.push(cur.left)
            }
            if (cur.right) {
                stack.push(cur.right)
            }
        }
        res.push(arr)
    }
    return res
};

107. 二叉树的层序遍历 II

var levelOrderBottom = function(root) {
    const res= []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.left) {
                stack.push(cur.left)
            }
            if (cur.right) {
                stack.push(cur.right)
            }
        }
        res.unshift(arr)
    }
    return res
};

199. 二叉树的右视图

var rightSideView = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.left) {
                stack.push(cur.left)
            }
            if (cur.right) {
                stack.push(cur.right)
            }
        }
        res.push(arr[arr.length - 1])
    }
    return res
};

637. 二叉树的层平均值

var averageOfLevels = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        let sum = 0
        let len = 0
        while (size--) {
            const cur = stack.shift()
            sum += cur.val
            len++
            if (cur.left) {
                stack.push(cur.left)
            }
            if (cur.right) {
                stack.push(cur.right)
            }
        }
        res.push((sum/len).toFixed(5))
    }
    return res
};

429. N 叉树的层序遍历

var levelOrder = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.children) {
                for (let i = 0; i < cur.children.length; i++) {
                    stack.push(cur.children[i])
                }
            }
        }
        res.push(arr)
    }
    return res
};

104. 二叉树的最大深度

var maxDepth = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.left) stack.push(cur.left)
            if (cur.right) stack.push(cur.right)
        }
        res.push(arr)
    }
    return res.length
};

116. 填充每个节点的下一个右侧节点指针

var connect = function(root) {
    if (root === null) return root
    let stack = [root]
    while (stack.length) {
        let size = stack.length
        for (let i = 0; i < size; i++) {
            const cur = stack.shift()
            if (i < size - 1) {
                cur.next = stack[0]
            }
            if (cur.left) stack.push(cur.left)
            if (cur.right) stack.push(cur.right)
        }
    }
    return root
};

思路:

1、这道题思路主要在于下个节点的指针指向当前节点进行连接

  • 515.在每个树行中找最大值

  • 117.填充每个节点的下一个右侧节点指针II

  • 111.二叉树的最小深度

    还有三道需要补充

226. 翻转二叉树

var invertTree = function(root) {
    const res = []
    const stack = []
    if (root !== null) stack.push(root)
    while (stack.length) {
        let size = stack.length
        const arr = []
        while (size--) {
            const cur = stack.shift()
            arr.push(cur.val)
            if (cur.right) {
                stack.push(cur.right)
            }
            if (cur.left) {
                stack.push(cur.left)
            }
        }
        res.push(arr)
    }

    function flat (data) {
        let arr = []
        for (let i = 0; i < data.length; i++) {
            if (Array.isArray(data[i])) {
                arr = arr.concat(flat(data[i]))
            } else {
                arr.push(data[i])
            }
        }
        return arr
    }
    const a = flat(res)
    return a
};

思路:报错了,没看出具体是哪儿的问题,需要后续再看下:指针问题

var invertTree = function(root) {
    if (root === null) return null
    let rightNode = root.right
    root.right = invertTree(root.left)
    root.left = invertTree(rightNode)
    return root
};

思路:

前序遍历

var invertTree = function(root) {
    if (root === null) return null
    const left = invertTree(root.left)
    const right = invertTree(root.right)
    root.right = left
    root.left = right
    return root
};

思路:后序遍历

二刷补充迭代和层序遍历

101. 对称二叉树

var isSymmetric = function(root) {
    function compare(left, right) {
        if (left === null && right !== null){
            return false
        } else if (left!== null && right === null) {
            return false 
        } else if (left === null && right === null) {
            return true
        } else if (left.val !== right.val) {
            return false
        } else if (left.val === right.val) {
            const inSide = compare(left.left, right.right)
            const outSide = compare(left.right, right.left)
            return inSide && outSide
        }
    }
    return compare(root.left, root.right)
};

思路:

1、这道题判断的左右子树是否可以互相翻转相同

2、同时对左右两个子树的节点进行比较

3、最后需要比较左侧子树的外侧节点和右子树的外侧节点是否相同,左子树的内侧节点和右子树的内侧节点是否相同,返回结果