算法学习记录(十一)

136 阅读1分钟

二叉树

问:

  1. 如何判断一个搜索二叉树
  2. 如何判断一个完全二叉树
  3. 如何判断一个满二叉树
  4. 如何判断一个平衡二叉树

解:

  1. 中序遍历
    let pre = Number.NEGATIVE_INFINITY
    function isSBT(node) {
        if (!node) return true
        const leftFlag = isSBT(node.left)
        if (!leftFlag || pre >= node.value) return false
        pre = node.value
        return isSBT(node.right)
    }
  1. 宽度优先遍历,首先不能是只有右孩子的节点,其次当遍历到第一个不完全节点后,剩余所有节点都只能是叶节点,否则不是完全二叉树
    function isCBT(node) {
        const queue = [node]
        let isFlagNode = false
        while (queue.length) {
            const curNode = queue.shift()
            if (curNode.left) queue.push(curNode.left)
            if (curNode.right) queue.push(curNode.right)
            // 如果存在右节点但是没有左节点 -> false。如果已碰到不完全节点并且存在左节点或者右节点 -> false
            if ((isFlagNode && (curNode.right || curNode.left)) || (!curNode.left && curNode.right)) return false
            // 碰到不完全节点,把不完全节点标识改为true
            if (!curNode.left && !curNode.right || (curNode.left && !curNode.right)) isFlagNode = true
        }
        return true
    }
  1. DP解法
    function isFBT (head) {
        if (!head) return true
        function treeInfo(node) {
            if (!node) return { height: 0, nodes: 0 }
            const leftInfo = treeInfo(node.left)
            const rightInfo = treeInfo(node.right)
            return {
                height: Math.max(leftInfo.height, right.height) + 1,
                nodes: leftInfo.nodes + right.nodes + 1
            }
        }
        const { height, nodes } = treeInfo(head)
        return nodes === 2 ** height - 1
    }
  1. 与上同理
    function isSBT(head) {
       if(!head) return true
       function treeInfo (node) {
           if(!node) return { sbtFlag: true, height: 0 }
           const leftInfo = treeInfo(node.left)
           const rightInfo = treeInfo(node.right)
           // 设置本体信息
           const height = Math.max(leftInfo.height, right.height) + 1
           const sbtFlag = leftInfo.sbtFlag && rightInfo.sbtFlag && Math.abs(leftInfo.height - right.h) < 2
           return {
               height
               sbtFlag
           }
       }
       return treeInfo.sbtFlag
    }