二叉树
问:
- 如何判断一个搜索二叉树
- 如何判断一个完全二叉树
- 如何判断一个满二叉树
- 如何判断一个平衡二叉树
解:
- 中序遍历
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)
}
- 宽度优先遍历,首先不能是只有右孩子的节点,其次当遍历到第一个不完全节点后,剩余所有节点都只能是叶节点,否则不是完全二叉树
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
}
- 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
}
- 与上同理
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
}