Automatic generation produced by ISE Eiffel

Classes Clusters Cluster hierarchy Chart Relations Text Flat Contracts Flat contracts Go to:
indexing description: "Binary tree: each node may have a left child and a right child" status: "See notice at end of class" names: binary_tree, tree, fixed_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_TREE [G] create make feature -- Initialization make (v: like item) is -- Create a root node with value v. do item := v ensure is_root: is_root is_leaf: is_leaf end feature -- Access child: like parent is -- Child at cursor position 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 do create {ARRAYED_LIST_CURSOR} Result.make (child_index) end child_index: INTEGER -- Index of cursor position 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 require -- from TREE is_not_leaf: not is_leaf do Result := left_child end item: G -- Content of cell. -- (from CELL) last_child: like parent is -- Right child require -- from TREE is_not_leaf: not is_leaf do Result := right_child end left_child: like parent -- Left child, if any left_item: like item is -- Value of left child require has_left: left_child /= void do Result := left_child.item end left_sibling: like parent is -- Left neighbor, if any 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_TREE [G] -- Parent of current node right_child: like parent -- Right child, if any right_item: like item is -- Value of right child require has_right: right_child /= void do Result := right_child.item end right_sibling: like parent is -- Right neighbor, if any 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 do if has_left then Result := Result + 1 end if has_right then Result := Result + 1 end ensure then valid_arity: Result <= 2 end count: INTEGER is -- Number of items -- (from TREE) do Result := subtree_count + 1 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? 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 (v: G): BOOLEAN is -- Does subtree include v? -- (Reference or object equality, -- based on object_comparison.) -- (from TREE) do if object_comparison then Result := (v /= void) and then (item /= void) and then (v.is_equal (item) or else subtree_has (v)) else Result := v = item or else subtree_has (v) end ensure -- from CONTAINER not_found_in_empty: Result implies not is_empty end has_both: BOOLEAN is -- Has current node two children? do Result := left_child /= void and right_child /= void ensure Result = (has_left and has_right) end has_left: BOOLEAN is -- Has current node a left child? do Result := left_child /= void ensure Result = (left_child /= void) end has_none: BOOLEAN is -- Are there no children? -- Was declared in BINARY_TREE as synonym of is_leaf. do Result := left_child = void and right_child = void end has_right: BOOLEAN is -- Has current node a right child? do Result := right_child /= void ensure 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. 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 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. do child_index := child_index - 1 end child_finish is -- Move cursor to last child. 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. do child_index := child_index + 1 end child_go_i_th (i: INTEGER) is -- Move cursor to i-th child. 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. do child_index := p.index end child_start is -- Move to first child. do child_index := 1 ensure then -- from TREE is_first_child: not is_leaf implies child_isfirst 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. 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.put (v) else create node.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. 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.put (v) else create node.make (v) if object_comparison then node.compare_objects end put_child (node) end ensure -- from TREE item_inserted: child_item = 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 -- 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. 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 put_left_child (n: like parent) is -- Set left_child to n. require no_parent: n = void or else n.is_root do if n /= void then if object_comparison then n.compare_objects else n.compare_references end end if left_child /= void then left_child.attach_to_parent (void) end if n /= void then n.attach_to_parent (Current) end left_child := n end put_right_child (n: like parent) is -- Set right_child to n. require no_parent: n = void or else n.is_root do if n /= void then if object_comparison then n.compare_objects else n.compare_references end end if right_child /= void then right_child.attach_to_parent (void) end if n /= void then n.attach_to_parent (Current) end right_child := n 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. require -- from TREE writable_child: writable_child was_root: n.is_root 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 ensure -- from TREE child_replaced: child = n end sprout is -- Make current node a root. -- (from TREE) do if parent /= void then parent.prune (Current) end end feature -- Removal child_remove is -- Remove current child. do inspect child_index when 1 then left_child.attach_to_parent (void); left_child := void when 2 then right_child.attach_to_parent (void); right_child := void end end prune (n: like parent) is -- Prune n from child nodes. require -- from TREE is_child: n.parent = Current do if left_child = n then remove_left_child elseif right_child = n then remove_right_child end ensure -- from TREE n_is_root: n.is_root end remove_left_child is -- Remove left child. do if left_child /= void then left_child.attach_to_parent (void) end left_child := void ensure not has_left end remove_right_child is -- Remove right child. do if right_child /= void then right_child.attach_to_parent (void) end right_child := void ensure not has_right end feature -- Conversion binary_representation: BINARY_TREE [G] is -- Convert to binary tree representation: -- first child becomes left child, -- right sibling becomes right child. -- (from TREE) local current_sibling: BINARY_TREE [G] do create Result.make (item) if not is_leaf then Result.put_left_child (first_child.binary_representation) from child_start child_forth current_sibling := Result.left_child until child_after loop current_sibling.put_right_child (child.binary_representation) current_sibling := current_sibling.right_child child_forth end end ensure -- from TREE result_is_root: Result.is_root result_has_no_right_child: not Result.has_right end linear_representation: LINEAR [G] is -- Representation as a linear structure -- (from TREE) local al: ARRAYED_LIST [G] do create al.make (count) al.start al.extend (item) fill_list (al) Result := al end feature -- Duplication copy (other: like Current) is -- Copy contents from other. require -- from ANY other_not_void: other /= void type_identity: same_type (other) local tmp_tree: like Current do create tmp_tree.make (other.item) if not other.is_leaf then tree_copy (other, tmp_tree) end ensure -- from ANY is_equal: is_equal (other) end duplicate (n: INTEGER): like Current is -- Copy of sub-tree beginning at cursor position and -- having min (n, arity - child_index + 1) -- children. require -- from TREE not_child_off: not child_off valid_sublist: n >= 0 do Result := new_tree if child_index <= 1 and child_index + n >= 1 and has_left then Result.put_left_child (left_child.duplicate_all) end if child_index <= 2 and child_index + n >= 2 and has_right then Result.put_right_child (right_child.duplicate_all) end end duplicate_all: like Current is do Result := new_tree if has_left then Result.put_left_child (left_child.duplicate_all) end if has_right then Result.put_right_child (right_child.duplicate_all) end end feature {BINARY_TREE} -- Implementation fill_list (al: ARRAYED_LIST [G]) is -- Fill al with all the children's items. do if left_child /= void then al.extend (left_child.item) left_child.fill_list (al) end if right_child /= void then al.extend (right_child.item) right_child.