namespace InterviewImproveCode
using System.Collections.Generic;
using System.Collections.ObjectModel;
public static void Main(string[] args)
TreeNode<string> treeNode = new TreeNode<string>("Root");
treeNode.AddChild("child1").AddChild("child1_grandchild1").AddChild("child1_grandchild2");
treeNode.AddChild("child2").AddChild("child2_grandchild1");
Console.WriteLine(string.Join(",", treeNode.Flatten()));
var grandchild_changedName = treeNode.Find("child2_grandchild1");
grandchild_changedName.Value = "child2_grandchild_1";
Console.WriteLine(string.Join(",", treeNode.Flatten()));
private readonly List<TreeNode<T>> _children = new List<TreeNode<T>>();
public TreeNode<T> this[int i]
get { return _children[i]; }
public TreeNode<T> Parent { get; private set; }
public ReadOnlyCollection<TreeNode<T>> Children
get { return _children.AsReadOnly(); }
public TreeNode<T> AddChild(T value)
var node = new TreeNode<T>(value) { Parent = this };
public TreeNode<T>[] AddChildren(params T[] values)
return values.Select(AddChild).ToArray();
public bool RemoveChild(TreeNode<T> node)
return _children.Remove(node);
public void Traverse(Action<T> action)
foreach (var child in _children)
public TreeNode<T> Find(T value)
TreeNode<T> treeNode = null;
Find(this, value, ref treeNode);
private void Find(TreeNode<T> treeNode, T Value, ref TreeNode<T> temp)
if (treeNode != null && temp == null)
if (treeNode.Value == (dynamic)Value)
while (treeNode.Children.Count > 0)
foreach (var child in treeNode.Children)
Find(child, Value, ref temp);
public IEnumerable<T> Flatten()
return new[] { Value }.Concat(_children.SelectMany(x => x.Flatten()));