Public feed #722528

Mine

public text v1 · immutable
Raw Edit
·published 2007-10-02 02:26 UTC
rendered paste body
/* example Trie structure
  
  -
 [0]
  |
 a|     d     b
 [1]---[2]---[4]
  |           |
 c|          a|     e     d
 [3]         [5]---[6]---[9]
              |
             d|     e
             [7]---[8]

*/


class TrieNode 
{
    char letter;
	int  index;
	
	TrieNode parent; // link to level above
	TrieNode next; // next node on same level  // sibling
	TrieNode link; // link to next level       // child
	
    public TrieNode(int i, char l)
	{	letter = l;
		index = i;
    }

	public void printNode(String message)
	{	System.out.println(index + " " + letter + " parent=" + parent + " link=" + link + " next=" + next + " " + message);
	}
	public String returnNode(String message)
	{	return(index + " " + letter + " parent=" + parent  + " link=" + link + " next=" + next + " " + message);
	}
 
} // end class TrieNode

class Trie 
{	TrieNode root;
	TrieNode current;
	int		nextIndexNumber = 0;
	String	parentnodes = "";

    public Trie()
	{	root = new TrieNode(nextIndexNumber, '-' ); // 0, <>
		root.parent = null;
		root.next = null;
		nextIndexNumber++;
	}
	
	public void printTrie()
	{	System.out.println("TRIE");
		inorder(root);
	}
	
	private void inorder(TrieNode currentNode)
	{
	 if(currentNode.link != null) inorder(currentNode.link);  
	 System.out.println( currentNode + " " + currentNode.returnNode(""));  
	 if(currentNode.next != null) inorder(currentNode.next); 
	}
	
	
	public TrieNode head()
	{	return root;
	}
	
	public TrieNode isChild(TrieNode currentNode, char letter)
	{	if(currentNode.link == null)	return null;
		currentNode = currentNode.link;
		while(true)
		{	if(currentNode.letter == letter)	return currentNode;
			else if(currentNode.next == null)	return null;
			else currentNode = currentNode.next;
		}
	}
	
	public TrieNode findNodeIndex(TrieNode currentNode, int i) {
		if (currentNode.index == i) {
			return currentNode;
		}

		if (currentNode.link != null) {
			TrieNode node = findNodeIndex(currentNode.link, i);
			if (node != null) {
				return node;
			}
		}

		if (currentNode.next != null) {
			TrieNode node = findNodeIndex(currentNode.next, i);
			if (node != null) {
				return node;
			}
		}

		return null;
	}
	
	public void traceBack(int i) {
		TrieNode currentNode = findNodeIndex(root, i);
		
		while(true) {
			parentnodes = parentnodes + currentNode.letter;
			currentNode = currentNode.parent;
			if(currentNode.parent == null) {
				break;
			}
		}
	}

	public TrieNode addNode(TrieNode currentNode, char l)
	{	TrieNode newNode = new TrieNode(nextIndexNumber, l);
		newNode.parent = currentNode;
		
		if(currentNode.link == null)
		{	currentNode.link = newNode;
		}
		else
		{	currentNode = currentNode.link;
			while(true)
			{	if(currentNode.next == null)	break;
				else currentNode = currentNode.next;
			}
			currentNode.next = newNode;
		}
		
		nextIndexNumber++;
		
		return newNode;
	}
	
}	// end class Trie