View difference between Paste ID: 1YkZA4NL and 9upa1Rf9
SHOW: | | - or go back to the newest paste.
1-
/*
1+
2-
Project 10.1
2+
3-
Directions: Write a method that returns the minimum value in a 2-3-4 tree
3+
4
class Tree234
5-
Plan:
5+
6-
- The 2-3-4 tree's minimum should ideally be the left most node's child (which will be a leaf)
6+
7-
- ie. xxx
7+
8-
     /   \
8+
9-
   xxx    xxx
9+
10-
   /        \
10+
11-
  oxx       xxx
11+
12-
  where o is the minimum value
12+
13
           curNode = getNextChild(curNode, min);
14-
- return the min value, we should write a method that returns a long (value)
14+
15-
- should just return the left most value
15+
16-
- Node has a getMin() method that returns the item at the left most value (represents the smallest amount in current node)
16+
17-
- if the parent at getMin() is not a leaf, go to the left child of that parent and call it again
17+
18-
- stop once getMin() is actually at a leaf
18+
19-
_ CANT FIGURE OUT HOW TO DO THIS
19+
20-
 */
20+
21
      int childNumber; // reference to index of child
22
      while(true)
23
         {
24
          // we set childNumber to = the currentNode.findItem(key) which returns the index of the matching value
25
          // if the matching value is not found, findItem() returns -1
26
          // if childNumber is found, we return that index
27
         if(( childNumber=curNode.findItem(key) ) != -1)
28
            return childNumber;               // found it
29
         else if( curNode.isLeaf() ) // if the current node is a leaf, we can't go farther down
30
            return -1;                        // can't find it
31
         else                                 // search deeper, current node is not a leaf
32
            curNode = getNextChild(curNode, key); // figures out which of the node's children it should go to next
33
         }  // end while
34
      }
35
// -------------------------------------------------------------
36
   // insert a DataItem
37
   // like find, except it splits a full node if it finds one
38
   // goes until it finds a leaf node, then inserts data item into leaf
39
   public void insert(long dValue)
40
      {
41
      Node curNode = root;
42
      DataItem tempItem = new DataItem(dValue); // temp item used to safely store data
43
44
      while(true)
45
         {
46
         if( curNode.isFull() )               // if node full,
47
            {
48
            split(curNode);                   // split it up
49
            curNode = curNode.getParent();    // back up, current node now equals the current node's parent (one level up)
50
            curNode = getNextChild(curNode, dValue); // search once through the item array
51
            // we then find if the next child is greater than or less than the value given
52
            }  // end if(node is full)
53
54
         else if( curNode.isLeaf() )          // if node is leaf,
55
            break;                            // go to insert data item, break out of loop
56
         else          // node is not full, not a leaf; so go to lower level
57
            curNode = getNextChild(curNode, dValue); // after this executes, it returns to the first if statement
58
         }  // end while
59
60
      curNode.insertItem(tempItem);       // insert the new DataItem (when it is a leaf and has been split)
61
      }  // end insert()
62
// -------------------------------------------------------------
63
   // split is passed the node it will split
64
   public void split(Node thisNode)     // split the node
65
      {
66
      // assumes node is full
67
      DataItem itemB, itemC;
68
      Node parent, child2, child3;
69
      int itemIndex;
70
      // two right most items are removed from the node and stored
71
      itemC = thisNode.removeItem();    // remove items from
72
      itemB = thisNode.removeItem();    // this node
73
      child2 = thisNode.disconnectChild(2); // remove children
74
      child3 = thisNode.disconnectChild(3); // from this node
75
76
      Node newRight = new Node();       // make new node, goes to the right of the node being split
77
78
      if(thisNode==root)                // if this is the root,
79
         {
80
         root = new Node();                // make new root
81
         parent = root;                    // root is our parent
82
         root.connectChild(0, thisNode);   // connect to parent
83
         }
84
      else                              // this node not the root
85
         parent = thisNode.getParent();    // get parent
86
87
      // deal with parent
88
      itemIndex = parent.insertItem(itemB); // item B is inserted in the parent node
89
      int n = parent.getNumItems();         // total items?
90
91
      for(int j=n-1; j>itemIndex; j--)          // move parent's
92
         {                                      // connections
93
         Node temp = parent.disconnectChild(j); // one child
94
         parent.connectChild(j+1, temp);        // to the right
95
         }
96
                                   // connect newRight to parent
97
      parent.connectChild(itemIndex+1, newRight);
98
99
      // deal with newRight
100
      newRight.insertItem(itemC);       // item C to newRight
101
      newRight.connectChild(0, child2); // connect to 0 and 1
102
      newRight.connectChild(1, child3); // on newRight
103
      }  // end split()
104
// -------------------------------------------------------------
105
   // gets appropriate child of node during search for value
106
   // we put in a parent node, and a value which will determine which child we pick
107
   // we will either pick the right child of a value, or the left child depending on which is greater
108
   public Node getNextChild(Node theNode, long theValue)
109
      {
110
      int j;
111
      // assumes node is not empty, not full, not a leaf
112
      int numItems = theNode.getNumItems();
113
      for(j=0; j<numItems; j++)          // for each item in node
114
         {                               
115
         if( theValue < theNode.getItem(j).dData ) // is the value given less than the value at the first index of the array?
116
            return theNode.getChild(j);  // if so, return left child so we can use it at another point in time
117
         }  // end for                   // otherwise, our value is greater we're greater, so
118
      return theNode.getChild(j);        // we return right child (the child right after the value given, greater)
119
      }
120
// -------------------------------------------------------------
121
   public void displayTree()
122
      {
123
      recDisplayTree(root, 0, 0);
124
      }
125
// -------------------------------------------------------------
126
   private void recDisplayTree(Node thisNode, int level,
127
                                              int childNumber)
128
      {
129
      System.out.print("level="+level+" child="+childNumber+" ");
130
      thisNode.displayNode();               // display this node
131
132
      // call ourselves for each child of this node
133
      int numItems = thisNode.getNumItems();
134
      for(int j=0; j<numItems+1; j++)
135
         {
136
         Node nextNode = thisNode.getChild(j);
137
         if(nextNode != null)
138
            recDisplayTree(nextNode, level+1, j);
139
         else
140
            return;
141
         }
142
      }  // end recDisplayTree()
143
// -------------------------------------------------------------\
144
   }  // end class Tree234