private static IEnumerable <TResult> DepthFirstFlattenIterator <TNode, TResult>(this IEnumerable <TNode> source, Func <TNode, IEnumerable <TNode> > childrenSelector, Func <TNode, int, TResult> resultSelector) { var list = source.Select(n => new NodeWithLevel <TNode>(n, 0)).ToLinkedList(); while (list.Count > 0) { var current = list.First !.Value; list.RemoveFirst(); yield return(resultSelector(current.Node, current.Level)); var llNode = list.First; foreach (var child in childrenSelector(current.Node)) { var newNode = new NodeWithLevel <TNode>(child, current.Level + 1); if (llNode != null) { list.AddBefore(llNode, newNode); } else { list.AddLast(newNode); } } } }
private static void Helper(TreeNode root, List <IList <int> > result) { if (root == null) { result.Add(new List <int>()); return; } else { var dict = new Dictionary <int, List <int> >(); var queue = new Queue <NodeWithLevel>(); var start = new NodeWithLevel(1, root); queue.Enqueue(start); while (queue.Count > 0) { var temp = queue.Dequeue(); if (dict.ContainsKey(temp.level)) { dict[temp.level].Add(temp.node.data); } else { dict[temp.level] = new List <int>() { temp.node.data }; } if (temp.node.left != null) { queue.Enqueue(new NodeWithLevel(temp.level + 1, temp.node.left)); } if (temp.node.right != null) { queue.Enqueue(new NodeWithLevel(temp.level + 1, temp.node.right)); } } var maxLevel = dict.Keys.Max(); for (var lev = maxLevel; lev >= 1; lev--) { result.Add(new List <int>()); ((List <int>)result[result.Count - 1]).AddRange(dict[lev]); } } }
private static void Helper(TreeNode root, IList <double> result) { var dict = new Dictionary <int, List <int> >(); var queue = new Queue <NodeWithLevel>(); var start = new NodeWithLevel(1, root); queue.Enqueue(start); while (queue.Count > 0) { var temp = queue.Dequeue(); if (dict.ContainsKey(temp.level)) { dict[temp.level].Add(temp.node.data); } else { dict[temp.level] = new List <int>() { temp.node.data }; } if (temp.node.left != null) { queue.Enqueue(new NodeWithLevel(temp.level + 1, temp.node.left)); } if (temp.node.right != null) { queue.Enqueue(new NodeWithLevel(temp.level + 1, temp.node.right)); } } var maxLevel = dict.Keys.Max(); for (var lev = 1; lev <= maxLevel; lev++) { var nodes = dict[lev]; var avg = nodes.Sum() / nodes.Count(); result.Add(avg); } }
public IList <IList <int> > LevelOrder(TreeNode root) { List <IList <int> > result = new List <IList <int> >(); if (root == null) { return(result); } Queue <NodeWithLevel> dfsQueue = new Queue <NodeWithLevel>(); dfsQueue.Enqueue(new NodeWithLevel(root, 0)); while (dfsQueue.Count > 0) { List <int> currentLevel = new List <int>(); NodeWithLevel currentNode = dfsQueue.Dequeue(); if (currentNode.nodeLevel >= result.Count) { currentLevel.Add(currentNode.node.val); result.Add(currentLevel); } else { result[currentNode.nodeLevel].Add(currentNode.node.val); } if (currentNode.node.left != null) { NodeWithLevel newNode = new NodeWithLevel(currentNode.node.left, currentNode.nodeLevel + 1); dfsQueue.Enqueue(newNode); } if (currentNode.node.right != null) { NodeWithLevel newNode = new NodeWithLevel(currentNode.node.right, currentNode.nodeLevel + 1); dfsQueue.Enqueue(newNode); } } return(result); }