the authors state about bidirectional search that (p. 80):
"Bidirectional search is implemented by having one or both of the
searches check each node before it is expanded to see if it is in the
fringe of the other search tree; if so a solution has been found."
Although this is true, if only one search checks in the other's fringe
bidirectional search is complete, but not optimal. Thus in Figure 3.17
p.81, there should be another footnote for bidirectional search
stating that in order to be optimal, both searches have to check the
fringe of the other before they expand each node.