<p>The code below always return an empty array from <code>GetModifiedMembers(object)</code>
but <code>dx.GetChangeSet().Updates.Contains( foo )</code> returns true.</p>

<pre><code>DataContext dx = new DataContext( string.Empty );
MockLinqDataObject foo = new MockLinqDataObject();
dx.GetTable( foo.GetType() ).Attach( foo );

foo.PK = Guid.NewGuid();

// always returns empty array
ModifiedMemberInfo[] arr_Result = dx.GetTable( foo.GetType() ).GetModifiedMembers( foo );
bool isOk = ( arr_Result.Length == 1 );
return isOk;
</code></pre>

<p>Does anyone know what there is wrong?</p>

<p>Thanks in advance?</p>

Why you have difficulty in locating the root? go from parent to parent until parent is not set.
BTW Are you talking about B+ trees? They auto balance using blocks of children that get split when a threshold is exceeded look at this image in wikipedia