// full x x x x x // not full x x x x x x bool isfull(n): if n == null: return true if n.left == null != n.right == null: // same as ^ return false return (n.left) && (n.right)perfect: tree has 2^depth -1 nodes (i.e. each level is full).
tip: The depths of left and right subtrees are equal at all levels.
// perfect x x x x x x x bool isPerfect(n): return depthPerfect(n) != null int? depthPerfect(n): if n == null: return 0 ldepth = (n.left) if rdepth == null: return null rdepth = (n.right) if rdepth == null: return null if ldepth != rdepth: return null return ldepth +1 // or rdepth +1complete: nodes at last level are filled from left.
tip: After encountering a null child, no nodes in queue should have any children.
// complete x x x x x x // not complete x x 6 x x 7 4 2 6 1 5 // bfs bool isComplete(node): if node == null: return true q = new q.enqueue(node) ended = false while !q.isEmpty(): n = q.dequeue() if ended && n.left != null: return false if n.left != null: q.enqueue(n.left) else: ended = true if ended && n.right != null: return false if n.right != null: q.enqueue(n.right) else: ended = true return true // bfs bool isComplete(node): if node == null: return true q = new q.enqueue(node) ended = false while !q.isEmpty(): n = q.dequeue() if ended && (n.left != null || n.right != null): return false if n.left == null && n.right != null: return false ended = n.left == null || n.right == null if n.left != null: q.enqueue(n.left) if n.right != null: q.enqueue(n.right) return true // dfs bool isComplete(n): return (n, count(n) -1) bool isComplete(n, maxi, i = 0): if n == null: return true if i > maxi: return false // faster to check right subtree first as // right subtree returns false if not complete return isComplete(n.right, maxi, i*2 +2) && isComplete(n.left, maxi, i*2 +1) int count(n): if n == null: return 0 return 1 + count(n.left) + count(n.right) // dfs bool isComplete(n): isComplete(n, count: {value: 0}, maxi: {value: 0}, i: 0) return count.value < i.value +1 isComplete(n, count, maxi, i): if n == null: return count.value++ maxi.value = max(maxi.value, i) (n.left, count, maxi, i*2 +1) (n.right, count, maxi, i*2 +2) // bfs bool isComplete(node): if node == null: return true q = new q.enqueue((node, iexp: 0)) i = 0 while !q.isEmpty(): n, iexp = q.dequeue() if iexp > i: return false i++ if n.left != null: q.enqueue((n.left, iexp*2 +1)) if n.right != null: q.enqueue((n.right, iexp*2 +2)) return true[Hat tip to ctci]
No comments:
Post a Comment