Automatic generation produced by ISE Eiffel

Classes Clusters Cluster hierarchy Chart Relations Text Flat Contracts Flat contracts Go to:
indexing description: "[ Binary search trees; left child item is less than current item, right child item is greater ]" status: "See notice at end of class" names: binary_search_tree, tree representation: recursive, array access: cursor, membership contents: generic date: "$Date: 2001/11/16 20:34:24 $" revision: "$Revision: 1.1.1.1 $" class BINARY_SEARCH_TREE [G -> COMPARABLE] create make feature -- Initialization make (v: like item) is -- Create single node with item v. require item_exists: v /= void do bt_make (v) ensure node_item: item = v no_child: (left_child = void) and (right_child = void) end bt_make (v: like item) is -- Create a root node with value v. -- (from BINARY_TREE) do item := v ensure -- from BINARY_TREE is_root: is_root is_leaf: is_leaf end feature -- Access child: like parent is -- Child at cursor position -- (from BINARY_TREE) require -- from TREE readable: readable_child do inspect child_index when 1 then Result := left_child when 2 then Result := right_child end end child_cursor: CURSOR is -- Current cursor position -- (from BINARY_TREE) do create {ARRAYED_LIST_CURSOR} Result.make (child_index) end child_index: INTEGER -- Index of cursor position -- (from BINARY_TREE) child_item: like item is -- Item in current child node -- (from TREE) require -- from TREE readable: child_readable do Result := child.item end first_child: like parent is -- Left child -- (from BINARY_TREE) require -- from TREE is_not_leaf: not is_leaf do Result := left_child end has (v: like item): BOOLEAN is -- Does tree contain a node whose item -- is equal to v (object comparison)? require -- from CONTAINER True require else argument_not_void: v /= void do if items_equal (item, v) then Result := True elseif v < item then if left_child /= void then set_comparison_mode (left_child); Result := left_child.has (v) end else if right_child /= void then set_comparison_mode (right_child) Result := right_child.has (v) end end ensure -- from CONTAINER not_found_in_empty: Result implies not is_empty end item: G -- Content of cell. -- (from CELL) last_child: like parent is -- Right child -- (from BINARY_TREE) require -- from TREE is_not_leaf: not is_leaf do Result := right_child end left_child: like parent -- Left child, if any -- (from BINARY_TREE) left_item: like item is -- Value of left child -- (from BINARY_TREE) require -- from BINARY_TREE has_left: left_child /= void do Result := left_child.item end left_sibling: like parent is -- Left neighbor, if any -- (from BINARY_TREE) require -- from TREE is_not_root: not is_root do if parent.right_child = Current then Result := parent.left_child end ensure -- from TREE is_sibling: Result /= void implies is_sibling (Result) right_is_current: (Result /= void) implies (Result.right_sibling = Current) end parent: BINARY_SEARCH_TREE [G] -- Parent of current node right_child: like parent -- Right child, if any -- (from BINARY_TREE) right_item: like item is -- Value of right child -- (from BINARY_TREE) require -- from BINARY_TREE has_right: right_child /= void do Result := right_child.item end right_sibling: like parent is -- Right neighbor, if any -- (from BINARY_TREE) require -- from TREE is_not_root: not is_root do if parent.left_child = Current then Result := parent.right_child end ensure -- from TREE is_sibling: Result /= void implies is_sibling (Result) left_is_current: (Result /= void) implies (Result.left_sibling = Current) end feature -- Measurement arity: INTEGER is -- Number of children -- (from BINARY_TREE) do if has_left then Result := Result + 1 end if has_right then Result := Result + 1 end ensure then -- from BINARY_TREE valid_arity: Result <= 2 end count: INTEGER is -- Number of items -- (from TREE) do Result := subtree_count + 1 end max: like item is -- Maximum item in tree do if has_right then Result := right_child.max else Result := item end ensure maximum_present: has (Result) end min: like item is -- Minimum item in tree do if has_left then Result := left_child.min else Result := item end ensure minimum_present: has (Result) end feature -- Comparison is_equal (other: like Current): BOOLEAN is -- Does other contain the same elements? -- (Reference or object equality, -- based on object_comparison.) -- (from TREE) require -- from ANY other_not_void: other /= void do if Current = other then Result := True else Result := (is_empty = other.is_empty) and (object_comparison = other.object_comparison) and (child_capacity = other.child_capacity) if Result and not is_empty then Result := tree_is_equal (Current, other) end end ensure -- from ANY symmetric: Result implies other.is_equal (Current) consistent: standard_is_equal (other) implies Result end feature -- Status report changeable_comparison_criterion: BOOLEAN is -- May object_comparison be changed? -- (Answer: yes by default.) -- (from CONTAINER) do Result := True end child_after: BOOLEAN is -- Is there no valid child position to the right of cursor? -- (from BINARY_TREE) do Result := child_index >= child_capacity + 1 end child_before: BOOLEAN is -- Is there no valid child position to the left of cursor? -- (from TREE) do Result := child_index = 0 end child_isfirst: BOOLEAN is -- Is cursor under first child? -- (from TREE) do Result := not is_leaf and child_index = 1 ensure -- from TREE not_is_leaf: Result implies not is_leaf end child_islast: BOOLEAN is -- Is cursor under last child? -- (from TREE) do Result := not is_leaf and child_index = child_capacity ensure -- from TREE not_is_leaf: Result implies not is_leaf end child_off: BOOLEAN is -- Is there no current child? -- (from TREE) do Result := child_before or child_after end child_readable: BOOLEAN is -- Is there a current child_item to be read? -- (from TREE) do Result := not child_off and then (child /= void) end child_writable: BOOLEAN is -- Is there a current child_item that may be modified? -- (from TREE) do Result := not child_off and then (child /= void) end empty: BOOLEAN is obsolete "ELKS 2000: Use `is_empty' instead" -- Is there no element? -- (from CONTAINER) do Result := is_empty end has_both: BOOLEAN is -- Has current node two children? -- (from BINARY_TREE) do Result := left_child /= void and right_child /= void ensure -- from BINARY_TREE Result = (has_left and has_right) end has_left: BOOLEAN is -- Has current node a left child? -- (from BINARY_TREE) do Result := left_child /= void ensure -- from BINARY_TREE Result = (left_child /= void) end has_none: BOOLEAN is -- Are there no children? -- Was declared in BINARY_TREE as synonym of is_leaf. -- (from BINARY_TREE) do Result := left_child = void and right_child = void end has_right: BOOLEAN is -- Has current node a right child? -- (from BINARY_TREE) do Result := right_child /= void ensure -- from BINARY_TREE Result = (right_child /= void) end is_empty: BOOLEAN is -- Is structure empty of items? -- (from TREE) do Result := False end is_leaf: BOOLEAN is -- Are there no children? -- Was declared in BINARY_TREE as synonym of has_none. -- (from BINARY_TREE) do Result := left_child = void and right_child = void end is_root: BOOLEAN is -- Is there no parent? -- (from TREE) do Result := parent = void end is_sibling (other: like parent): BOOLEAN is -- Are current node and other siblings? -- (from TREE) require -- from TREE other_exists: other /= void do Result := not is_root and other.parent = parent ensure -- from TREE not_root: Result implies not is_root other_not_root: Result implies not other.is_root same_parent: Result = not is_root and other.parent = parent end object_comparison: BOOLEAN -- Must search operations use equal rather than = -- for comparing references? (Default: no, use =.) -- (from CONTAINER) Readable: BOOLEAN is True -- (from TREE) readable_child: BOOLEAN is -- Is there a current child to be read? -- (from TREE) do Result := not child_off end sorted: BOOLEAN is -- Is tree sorted? do Result := True if (has_left and then left_item > item) or (has_right and then right_item < item) then Result := False else if has_left then Result := left_child.sorted_and_less (item) end if has_right and Result then Result := right_child.sorted end end end sorted_and_less (i: like item): BOOLEAN is -- Is tree sorted and all its elements less then i do Result := True if (has_left and then left_item > item) or (has_right and then right_item < item) then Result := False else if has_left then Result := left_child.sorted_and_less (item) end if has_right and Result then Result := right_child.sorted_and_less (i) end end end valid_cursor_index (i: INTEGER): BOOLEAN is -- Is i correctly bounded for cursor movement? -- (from TREE) do Result := (i >= 0) and (i <= child_capacity + 1) ensure -- from TREE valid_cursor_index_definition: Result = (i >= 0) and (i <= child_capacity + 1) end Writable: BOOLEAN is True -- Is there a current item that may be modified? -- (from TREE) writable_child: BOOLEAN is -- Is there a current child that may be modified? -- (from TREE) do Result := not child_off end feature -- Status setting compare_objects is -- Ensure that future search operations will use equal -- rather than = for comparing references. -- (from CONTAINER) require -- from CONTAINER changeable_comparison_criterion do object_comparison := True ensure -- from CONTAINER object_comparison end compare_references is -- Ensure that future search operations will use = -- rather than equal for comparing references. -- (from CONTAINER) require -- from CONTAINER changeable_comparison_criterion do object_comparison := False ensure -- from CONTAINER reference_comparison: not object_comparison end feature -- Cursor movement child_back is -- Move cursor to previous child. -- (from BINARY_TREE) do child_index := child_index - 1 end child_finish is -- Move cursor to last child. -- (from BINARY_TREE) do child_index := 2 ensure then -- from TREE is_last_child: not is_leaf implies child_islast end child_forth is -- Move cursor to next child. -- (from BINARY_TREE) do child_index := child_index + 1 end child_go_i_th (i: INTEGER) is -- Move cursor to i-th child. -- (from BINARY_TREE) require else -- from TREE valid_cursor_index: valid_cursor_index (i) do child_index := i ensure then -- from TREE position: child_index = i end child_go_to (p: ARRAYED_LIST_CURSOR) is -- Move cursor to child remembered by p. -- (from BINARY_TREE) do child_index := p.index end child_start is -- Move to first child. -- (from BINARY_TREE) do child_index := 1 ensure then -- from TREE is_first_child: not is_leaf implies child_isfirst end i_infix is -- Apply node_action to every node's item -- in tree, using infix order. do if left_child /= void then left_child.i_infix end node_action (item) if right_child /= void then right_child.i_infix end end node_action (v: like item) is -- Operation on node item, -- to be defined by descendant classes. -- Here it is defined as an empty operation. -- Redefine this procedure in descendant classes if useful -- operations are to be performed during traversals. do end postorder is -- Apply node_action to every node's item -- in tree, using post-order. do if left_child /= void then left_child.postorder end if right_child /= void then right_child.postorder end node_action (item) end preorder is -- Apply node_action to every node's item -- in tree, using pre-order. do node_action (item) if left_child /= void then left_child.preorder end if right_child /= void then right_child.preorder end end feature -- Element change child_put (v: like item) is -- Put v at current child position. -- Was declared in BINARY_TREE as synonym of child_replace. -- (from BINARY_TREE) require -- from TREE child_writable: child_writable local node: like Current do if child /= void then if object_comparison then child.compare_objects else child.compare_references end child.bt_put (v) else create node.bt_make (v) if object_comparison then node.compare_objects end put_child (node) end ensure -- from TREE item_inserted: child_item = v end child_replace (v: like item) is -- Put v at current child position. -- Was declared in BINARY_TREE as synonym of child_put. -- (from BINARY_TREE) require -- from TREE child_writable: child_writable local node: like Current do if child /= void then if object_comparison then child.compare_objects else child.compare_references end child.bt_put (v) else create node.bt_make (v) if object_comparison then node.compare_objects end put_child (node) end ensure -- from TREE item_inserted: child_item = v end extend (v: like item) is -- Put v at proper position in tree -- (unless v exists already). -- (Reference or object equality, -- based on object_comparison.) -- Was declared in BINARY_SEARCH_TREE as synonym of put. require new_item_exists: v /= void do if not items_equal (v, item) then if v < item then if left_child = void then put_left_child (new_tree) left_child.replace (v) else left_child.put (v) end else if right_child = void then put_right_child (new_tree) right_child.replace (v) else right_child.put (v) end end end ensure item_inserted: has (v) end fill (other: TREE [G]) is -- Fill with as many items of other as possible. -- The representations of other and current node -- need not be the same. -- (from TREE) do replace (other.item) fill_subtree (other) end put (v: like item) is -- Put v at proper position in tree -- (unless v exists already). -- (Reference or object equality, -- based on object_comparison.) -- Was declared in BINARY_SEARCH_TREE as synonym of extend. require new_item_exists: v /= void do if not items_equal (v, item) then if v < item then if left_child = void then put_left_child (new_tree) left_child.replace (v) else left_child.put (v) end else if right_child = void then put_right_child (new_tree) right_child.replace (v) else right_child.put (v) end end end ensure item_inserted: has (v) end bt_put (v: like item) is -- Make v the cell's item. -- Was declared in CELL as synonym of replace. -- (from CELL) require -- from TREE is_writable: writable do item := v ensure -- from TREE item_inserted: item = v ensure -- from CELL item_inserted: item = v end put_child (n: like parent) is -- Put n at current child position. -- Was declared in BINARY_TREE as synonym of replace_child. -- (from BINARY_TREE) do if object_comparison then n.compare_objects else n.compare_references end n.attach_to_parent (Current) inspect child_index when 1 then left_child := n when 2 then right_child := n end end replace (v: like item) is -- Make v the cell's item. -- Was declared in CELL as synonym of put. -- (from CELL) require -- from TREE is_writable: writable do item := v ensure -- from TREE item_inserted: item = v ensure -- from CELL item_inserted: item = v end replace_child (n: like parent) is -- Put n at current child position. -- Was declared in BINARY_TREE as synonym of put_child. -- (from