Repository: gt4dev/yet-another-tree-structure Branch: master Commit: f877f7123f60 Files: 17 Total size: 16.1 KB Directory structure: gitextract_q36xmw2f/ ├── README.md ├── csharp/ │ ├── CSharpTree/ │ │ ├── App.config │ │ ├── CSharpTree.csproj │ │ ├── Properties/ │ │ │ └── AssemblyInfo.cs │ │ ├── SampleData.cs │ │ ├── SampleIterating.cs │ │ ├── SampleSearching.cs │ │ └── TreeNode.cs │ └── CSharpTree.sln └── java/ ├── .classpath ├── .project ├── .settings/ │ └── org.eclipse.jdt.core.prefs └── src/ └── com/ └── tree/ ├── SampleData.java ├── SampleIterating.java ├── SampleSearching.java ├── TreeNode.java └── TreeNodeIter.java ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ # yet-another-tree-structure ================================================ FILE: csharp/CSharpTree/App.config ================================================  ================================================ FILE: csharp/CSharpTree/CSharpTree.csproj ================================================  Debug AnyCPU {4F3E0879-E048-4D79-B2D0-F9D8A5218F8A} Exe Properties CSharpTree CSharpTree v4.5 512 AnyCPU true full false bin\Debug\ DEBUG;TRACE prompt 4 AnyCPU pdbonly true bin\Release\ TRACE prompt 4 ================================================ FILE: csharp/CSharpTree/Properties/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. [assembly: AssemblyTitle("CSharpTree")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("CSharpTree")] [assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(false)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("cb7b1cae-9306-4b82-b99d-16ff56d33f33")] // Version information for an assembly consists of the following four values: // // Major Version // Minor Version // Build Number // Revision // // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] [assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.0.0.0")] ================================================ FILE: csharp/CSharpTree/SampleData.cs ================================================ namespace CSharpTree { class SampleData { public static TreeNode GetSet1() { TreeNode root = new TreeNode("root"); { TreeNode node0 = root.AddChild("node0"); TreeNode node1 = root.AddChild("node1"); TreeNode node2 = root.AddChild("node2"); { TreeNode node20 = node2.AddChild(null); TreeNode node21 = node2.AddChild("node21"); { TreeNode node210 = node21.AddChild("node210"); TreeNode node211 = node21.AddChild("node211"); } } TreeNode node3 = root.AddChild("node3"); { TreeNode node30 = node3.AddChild("node30"); } } return root; } } } ================================================ FILE: csharp/CSharpTree/SampleIterating.cs ================================================ using System; using System.Text; namespace CSharpTree { class SampleIterating { static void MainTest(string[] args) { TreeNode treeRoot = SampleData.GetSet1(); foreach (TreeNode node in treeRoot) { string indent = CreateIndent(node.Level); Console.WriteLine(indent + (node.Data ?? "null")); } } private static String CreateIndent(int depth) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < depth; i++) { sb.Append(' '); } return sb.ToString(); } } } ================================================ FILE: csharp/CSharpTree/SampleSearching.cs ================================================ using System; namespace CSharpTree { class SampleSearching { static void Main(string[] args) { TreeNode treeRoot = SampleData.GetSet1(); TreeNode found = treeRoot.FindTreeNode(node => node.Data != null && node.Data.Contains("210")); Console.WriteLine("Found: " + found); } } } ================================================ FILE: csharp/CSharpTree/TreeNode.cs ================================================ using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace CSharpTree { public class TreeNode : IEnumerable> { public T Data { get; set; } public TreeNode Parent { get; set; } public ICollection> Children { get; set; } public Boolean IsRoot { get { return Parent == null; } } public Boolean IsLeaf { get { return Children.Count == 0; } } public int Level { get { if (this.IsRoot) return 0; return Parent.Level + 1; } } public TreeNode(T data) { this.Data = data; this.Children = new LinkedList>(); this.ElementsIndex = new LinkedList>(); this.ElementsIndex.Add(this); } public TreeNode AddChild(T child) { TreeNode childNode = new TreeNode(child) { Parent = this }; this.Children.Add(childNode); this.RegisterChildForSearch(childNode); return childNode; } public override string ToString() { return Data != null ? Data.ToString() : "[data null]"; } #region searching private ICollection> ElementsIndex { get; set; } private void RegisterChildForSearch(TreeNode node) { ElementsIndex.Add(node); if (Parent != null) Parent.RegisterChildForSearch(node); } public TreeNode FindTreeNode(Func, bool> predicate) { return this.ElementsIndex.FirstOrDefault(predicate); } #endregion #region iterating IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } public IEnumerator> GetEnumerator() { yield return this; foreach (var directChild in this.Children) { foreach (var anyChild in directChild) yield return anyChild; } } #endregion } } ================================================ FILE: csharp/CSharpTree.sln ================================================  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2012 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpTree", "CSharpTree\CSharpTree.csproj", "{4F3E0879-E048-4D79-B2D0-F9D8A5218F8A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {4F3E0879-E048-4D79-B2D0-F9D8A5218F8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4F3E0879-E048-4D79-B2D0-F9D8A5218F8A}.Debug|Any CPU.Build.0 = Debug|Any CPU {4F3E0879-E048-4D79-B2D0-F9D8A5218F8A}.Release|Any CPU.ActiveCfg = Release|Any CPU {4F3E0879-E048-4D79-B2D0-F9D8A5218F8A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal ================================================ FILE: java/.classpath ================================================ ================================================ FILE: java/.project ================================================ yet-another-tree-structure org.eclipse.jdt.core.javabuilder org.eclipse.jdt.core.javanature ================================================ FILE: java/.settings/org.eclipse.jdt.core.prefs ================================================ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.source=1.6 ================================================ FILE: java/src/com/tree/SampleData.java ================================================ package com.tree; class SampleData { public static TreeNode getSet1() { TreeNode root = new TreeNode("root"); { TreeNode node0 = root.addChild("node0"); TreeNode node1 = root.addChild("node1"); TreeNode node2 = root.addChild("node2"); { TreeNode node20 = node2.addChild(null); TreeNode node21 = node2.addChild("node21"); { TreeNode node210 = node21.addChild("node210"); TreeNode node211 = node21.addChild("node211"); } } TreeNode node3 = root.addChild("node3"); { TreeNode node30 = node3.addChild("node30"); } } return root; } public static TreeNode getSetSOF() { TreeNode root = new TreeNode("root"); { TreeNode node0 = root.addChild("node0"); TreeNode node1 = root.addChild("node1"); TreeNode node2 = root.addChild("node2"); { TreeNode node20 = node2.addChild(null); TreeNode node21 = node2.addChild("node21"); { TreeNode node210 = node20.addChild("node210"); } } } return root; } } ================================================ FILE: java/src/com/tree/SampleIterating.java ================================================ package com.tree; class SampleIterating { public static void main(String[] args) { TreeNode treeRoot = SampleData.getSet1(); for (TreeNode node : treeRoot) { String indent = createIndent(node.getLevel()); System.out.println(indent + node.data); } } private static String createIndent(int depth) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < depth; i++) { sb.append(' '); } return sb.toString(); } } ================================================ FILE: java/src/com/tree/SampleSearching.java ================================================ package com.tree; class SampleSearching { public static void main(String[] args) { Comparable searchCriteria = new Comparable() { @Override public int compareTo(String treeData) { if (treeData == null) return 1; boolean nodeOk = treeData.contains("210"); return nodeOk ? 0 : 1; } }; TreeNode treeRoot = SampleData.getSet1(); TreeNode found = treeRoot.findTreeNode(searchCriteria); System.out.println("Found: " + found); } } ================================================ FILE: java/src/com/tree/TreeNode.java ================================================ package com.tree; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class TreeNode implements Iterable> { public T data; public TreeNode parent; public List> children; public boolean isRoot() { return parent == null; } public boolean isLeaf() { return children.size() == 0; } private List> elementsIndex; public TreeNode(T data) { this.data = data; this.children = new LinkedList>(); this.elementsIndex = new LinkedList>(); this.elementsIndex.add(this); } public TreeNode addChild(T child) { TreeNode childNode = new TreeNode(child); childNode.parent = this; this.children.add(childNode); this.registerChildForSearch(childNode); return childNode; } public int getLevel() { if (this.isRoot()) return 0; else return parent.getLevel() + 1; } private void registerChildForSearch(TreeNode node) { elementsIndex.add(node); if (parent != null) parent.registerChildForSearch(node); } public TreeNode findTreeNode(Comparable cmp) { for (TreeNode element : this.elementsIndex) { T elData = element.data; if (cmp.compareTo(elData) == 0) return element; } return null; } @Override public String toString() { return data != null ? data.toString() : "[data null]"; } @Override public Iterator> iterator() { TreeNodeIter iter = new TreeNodeIter(this); return iter; } } ================================================ FILE: java/src/com/tree/TreeNodeIter.java ================================================ package com.tree; import java.util.Iterator; public class TreeNodeIter implements Iterator> { enum ProcessStages { ProcessParent, ProcessChildCurNode, ProcessChildSubNode } private TreeNode treeNode; public TreeNodeIter(TreeNode treeNode) { this.treeNode = treeNode; this.doNext = ProcessStages.ProcessParent; this.childrenCurNodeIter = treeNode.children.iterator(); } private ProcessStages doNext; private TreeNode next; private Iterator> childrenCurNodeIter; private Iterator> childrenSubNodeIter; @Override public boolean hasNext() { if (this.doNext == ProcessStages.ProcessParent) { this.next = this.treeNode; this.doNext = ProcessStages.ProcessChildCurNode; return true; } if (this.doNext == ProcessStages.ProcessChildCurNode) { if (childrenCurNodeIter.hasNext()) { TreeNode childDirect = childrenCurNodeIter.next(); childrenSubNodeIter = childDirect.iterator(); this.doNext = ProcessStages.ProcessChildSubNode; return hasNext(); } else { this.doNext = null; return false; } } if (this.doNext == ProcessStages.ProcessChildSubNode) { if (childrenSubNodeIter.hasNext()) { this.next = childrenSubNodeIter.next(); return true; } else { this.next = null; this.doNext = ProcessStages.ProcessChildCurNode; return hasNext(); } } return false; } @Override public TreeNode next() { return this.next; } @Override public void remove() { throw new UnsupportedOperationException(); } }