Breadth-first traversal

前端 未结 3 2018
无人及你
无人及你 2020-12-13 00:07

I was trying to solve one interview question, but for that I have to travel the binary tree level by level. I have designed BinaryNode with having below variable

         


        
相关标签:
3条回答
  • 2020-12-13 00:33

    A breadth first search is usually implemented with a queue, a depth first search using a stack.

    Queue<Node> q = new Queue<Node>();
    q.Enqueue(root);
    while(q.Count > 0)
    {
        Node current = q.Dequeue();
        if(current == null)
            continue;
        q.Enqueue(current.Left);
        q.Enqueue(current.Right);
    
        DoSomething(current);
    }
    

    As an alternative to checking for null after dequeuing you can check before adding to the Queue. I didn't compile the code, so it might contain some small mistakes.


    A fancier (but slower) version that integrates well with LINQ:

    public static IEnumerable<T> BreadthFirstTopDownTraversal<T>(T root, Func<T, IEnumerable<T>> children)
    {
        var q = new Queue<T>();
        q.Enqueue(root);
        while (q.Count > 0)
        {
            T current = q.Dequeue();
            yield return current;
            foreach (var child in children(current))
                q.Enqueue(child);
        }
    }
    

    Which can be used together with a Children property on Node:

    IEnumerable<Node> Children { get { return new []{ Left, Right }.Where(x => x != null); } }
    

    ...

    foreach(var node in BreadthFirstTopDownTraversal(root, node => node.Children))
    {
       ...
    }
    
    0 讨论(0)
  • 2020-12-13 00:43
    var queue = new Queue<BinaryNode>();
    queue.Enqueue(rootNode);
    
    while(queue.Any())
    {
      var currentNode = queue.Dequeue();
      if(currentNode.data == searchedData)
      {
        break;
      }
    
      if(currentNode.Left != null)
        queue.Enqueue(currentNode.Left);
    
      if(currentNode.Right != null)
        queue.Enqueue(currentNode.Right);
    }
    
    0 讨论(0)
  • 2020-12-13 00:59

    using DFS approach: The tree traversal is O(n)

    public class NodeLevel
    {
        public TreeNode Node { get; set;}
        public int Level { get; set;}
    }
    
    public class NodeLevelList
    {
        private Dictionary<int,List<TreeNode>> finalLists = new Dictionary<int,List<TreeNode>>();
    
        public void AddToDictionary(NodeLevel ndlvl)
        {
            if(finalLists.ContainsKey(ndlvl.Level))
            {
                finalLists[ndlvl.Level].Add(ndlvl.Node);
            }
            else
            {
                finalLists.Add(ndlvl.Level,new List<TreeNode>(){ndlvl.Node});
            }
        }
    
        public Dictionary<int,List<TreeNode>> GetFinalList()
        {
            return finalLists;
        }
    }
    

    The method that does traversal:

    public static void DFSLevel(TreeNode root, int level, NodeLevelList nodeLevelList)
    {
        if(root == null)
            return;
    
        nodeLevelList.AddToDictionary(new NodeLevel{Node = root, Level = level});
    
        level++;
    
        DFSLevel(root.Left,level,nodeLevelList);
        DFSLevel(root.Right,level,nodeLevelList);
    
    }
    
    0 讨论(0)
提交回复
热议问题