<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=TreeTraversal</id>
	<title>TreeTraversal - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pickwiki.org/index.php?action=history&amp;feed=atom&amp;title=TreeTraversal"/>
	<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TreeTraversal&amp;action=history"/>
	<updated>2026-04-28T23:40:46Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://pickwiki.org/index.php?title=TreeTraversal&amp;diff=2319&amp;oldid=prev</id>
		<title>Conversion script: link fix</title>
		<link rel="alternate" type="text/html" href="https://pickwiki.org/index.php?title=TreeTraversal&amp;diff=2319&amp;oldid=prev"/>
		<updated>2015-02-26T23:48:56Z</updated>

		<summary type="html">&lt;p&gt;link fix&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;A function to find the ultimate parent of a particular node, assuming that you provide the key, the file, and the field that holds keys to parents.  It will return -1 if the tree contains more than one &amp;quot;top&amp;quot; node.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FUNCTION A51.ULTIMATE.PARENT( ID, FILENAME, FIELD.NUM )&lt;br /&gt;
&lt;br /&gt;
      X.NODE.ID = ID&lt;br /&gt;
&lt;br /&gt;
      ;*OPEN FILENAME TO F.FILE ELSE RETURN -2&lt;br /&gt;
&lt;br /&gt;
      ;* Changed after posting to u2-users... seems to work from [[UniBasic]].&lt;br /&gt;
      IF NOT(FILEINFO(FILENAME,0)) THEN                               &lt;br /&gt;
          CRT &amp;#039;Opening file&amp;#039;&lt;br /&gt;
          OPEN FILENAME TO F.FILE ELSE RETURN -2                         &lt;br /&gt;
      END ELSE&lt;br /&gt;
          CRT &amp;#039;Assigning file handle&amp;#039;&lt;br /&gt;
          F.FILE = FILENAME &lt;br /&gt;
      END&lt;br /&gt;
&lt;br /&gt;
      X.PARENT = &amp;#039;&amp;#039;&lt;br /&gt;
      X.STACK = &amp;#039;&amp;#039;&lt;br /&gt;
      X.STATUS = &amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
      LOOP&lt;br /&gt;
         CRT &amp;#039;X.NODE.ID is &amp;#039;:X.NODE.ID&lt;br /&gt;
         READV X.DATA FROM F.FILE, X.NODE.ID, FIELD.NUM THEN &lt;br /&gt;
            X.STATUS = 0&lt;br /&gt;
         END ELSE&lt;br /&gt;
            X.STATUS = 1&lt;br /&gt;
         END&lt;br /&gt;
         IF X.DATA = &amp;#039;&amp;#039; AND X.STATUS = 0 THEN&lt;br /&gt;
            CRT X.NODE.ID: &amp;#039; has no parents, keep it&amp;#039;&lt;br /&gt;
            IF X.PARENT NE &amp;#039;&amp;#039; AND X.PARENT NE X.NODE.ID THEN&lt;br /&gt;
               CRT &amp;#039;We already found an ultimate parent, &amp;#039;:X.PARENT&lt;br /&gt;
               CRT &amp;#039;and this would be a second one - ERROR&amp;#039;&lt;br /&gt;
               RETURN -1&lt;br /&gt;
            END ELSE&lt;br /&gt;
               CRT &amp;#039;Setting X.PARENT to &amp;#039;:X.NODE.ID&lt;br /&gt;
               X.PARENT = X.NODE.ID&lt;br /&gt;
            END&lt;br /&gt;
         END ELSE&lt;br /&gt;
            CRT &amp;#039;Pushing &amp;#039;:X.DATA:&amp;#039; onto stack&amp;#039;&lt;br /&gt;
            INS X.DATA BEFORE X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         END&lt;br /&gt;
         CRT &amp;#039;X.STACK is &amp;#039;:X.STACK&lt;br /&gt;
         X.NODE.ID = X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         DEL X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         CRT &amp;#039;Popping &amp;#039;:X.NODE.ID:&amp;#039; from stack&amp;#039;&lt;br /&gt;
      WHILE X.NODE.ID DO REPEAT&lt;br /&gt;
&lt;br /&gt;
      RETURN X.PARENT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
&lt;br /&gt;
The companion function which, given a key to an &amp;#039;ultimate parent&amp;#039;, finds all of the children of that node.  For any child that has&lt;br /&gt;
multiple parents, it looks back up the tree to make sure they all trace to the same ultimate parent that we started with.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FUNCTION A51.ALL.CHILDREN( ID, FILENAME, CHILD.FIELD.NUM, PARENT.FIELD.NUM )&lt;br /&gt;
&lt;br /&gt;
      DEFFUN A51.ULTIMATE.PARENT( ARG1, FILENAME, FIELD.NUM )&lt;br /&gt;
&lt;br /&gt;
      CRT &amp;#039;A51.ALL.CHILDREN CALLED&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      X.NODE.ID = ID&lt;br /&gt;
      ;*OPEN FILE.NAME TO F.FILE ELSE RETURN -2&lt;br /&gt;
      IF NOT(FILEINFO(FILENAME,0)) THEN                               &lt;br /&gt;
          CRT &amp;#039;Opening file&amp;#039;&lt;br /&gt;
          OPEN FILENAME TO F.FILE ELSE RETURN -2                         &lt;br /&gt;
      END ELSE&lt;br /&gt;
          CRT &amp;#039;Assigning file handle&amp;#039;&lt;br /&gt;
          F.FILE = FILENAME &lt;br /&gt;
      END&lt;br /&gt;
&lt;br /&gt;
      X.STACK = &amp;#039;&amp;#039;&lt;br /&gt;
      X.LIST = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
      LOOP&lt;br /&gt;
         READ R.DATA FROM F.FILE, X.NODE.ID THEN END&lt;br /&gt;
         X.DATA = R.DATA&amp;lt;CHILD.FIELD.NUM&amp;gt;&lt;br /&gt;
         CRT &amp;#039;Direct children of &amp;#039;:X.NODE.ID:&amp;#039; are &amp;#039;:X.DATA &lt;br /&gt;
         IF X.DATA NE &amp;#039;&amp;#039; AND NOT(STATUS()) THEN &lt;br /&gt;
            ;* Check that this record has only one parent&lt;br /&gt;
            ;* If not, look up the tree to make sure they&lt;br /&gt;
            ;* all have the same ultimate parent&lt;br /&gt;
            X.COUNT = DCOUNT(R.DATA&amp;lt;CHILD.FIELD.NUM&amp;gt;,@VM)&lt;br /&gt;
            IF X.COUNT GT 1 THEN&lt;br /&gt;
               CRT X.NODE.ID:&amp;#039; has multiple parents &amp;#039;&lt;br /&gt;
               FOR X = 1 TO X.COUNT&lt;br /&gt;
                  X.KEY = R.DATA&amp;lt;CHILD.FIELD.NUM,X&amp;gt;&lt;br /&gt;
                  X.PARENT = A51.ULTIMATE.PARENT(X.KEY,F.FILE,PARENT.FIELD.NUM)&lt;br /&gt;
                  IF X.PARENT NE ID THEN&lt;br /&gt;
                     CRT &amp;#039;Ultimate parent of &amp;#039;:X.KEY:&amp;#039; is &amp;#039;:X.PARENT:&amp;#039; which differs from &amp;#039;:ID&lt;br /&gt;
                     RETURN -1&lt;br /&gt;
                  END&lt;br /&gt;
               NEXT X&lt;br /&gt;
            END&lt;br /&gt;
               &lt;br /&gt;
            INS X.DATA BEFORE X.LIST&amp;lt;1,1&amp;gt;&lt;br /&gt;
            CRT &amp;#039;Pushing &amp;#039;:X.DATA:&amp;#039; onto stack&amp;#039;&lt;br /&gt;
            INS X.DATA BEFORE X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         END&lt;br /&gt;
         X.NODE.ID = X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         DEL X.STACK&amp;lt;1,1&amp;gt;&lt;br /&gt;
         CRT &amp;#039;Popping &amp;#039;:X.NODE.ID:&amp;#039; from stack&amp;#039;&lt;br /&gt;
      WHILE X.NODE.ID DO REPEAT&lt;br /&gt;
&lt;br /&gt;
      RETURN X.LIST&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Conversion script</name></author>
	</entry>
</feed>