Пример #1
0
        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);
    }