Binary Tree : Print Path From Root To Leaves & Max Depth

Problem : Given the following binary tree, print all the paths from root node to all the leave nodes.

temp (2)

Output :

  • 20 –> 9 –> 5
  • 20 –> 9 –> 12 –> 15
  • 20 –> 49 –> 23
  • 20 –> 49 –> 52 –> 50

Solution :

The output clearly highlights the fact that a depth first traversal of the tree will get us the desired out. Important thing to note here is that, a given node is not marked as visited unless until all of its left & right child tree nodes have been visited i.e. a node that gets selected first will be the last one to be marked as visited(FILO – first in last out) or in other words, a node that is selected last will be the first one to be marked as visited(LIFO).

Steps:

  • Node structure to have “isVisited” boolean property defaulted to false. Once all of the child nodes are visited, isVisited flag will be set to true.
  • For traversal & back-tracking support, we will make use of Stack data structure. The implementation & its usage is self explanatory from the code given below.

Code

void Main()
{
    Node n20 = new Node(20);
    n20.Left = new Node(9);
    n20.Left.Left = new Node(5);
    n20.Left.Right = new Node(12);
    n20.Left.Right.Right = new Node(15);
    n20.Right = new Node(49);
    n20.Right.Left = new Node(23);
    n20.Right.Right = new Node(52);
    n20.Right.Right.Left = new Node(50);
    
    PrintPath(n20);
}

public class Node
{
    public Node Left {get; set;}
    public Node Right {get; set;}
    public bool IsVisited {get; set;}
    public int Value {get;set;}
    
    public Node(int value)
    {
        this.Value = value;
    }
}

public static bool IsLeaveElement(Node node)
{
    if(node == null) return false;
    if(node.Left == null && node.Right == null) return true;
    return false;
}

public static void PrintPath(Node node)
{
    Stack<Node> stack = new Stack<Node>();
    stack.Push(node);
    
    while(stack.Count != 0)
    {
        Node item = stack.Peek();
        
        if(!item.IsVisited) {
            Node tempLeft = item.Left;
            if(tempLeft != null && !tempLeft.IsVisited)
            {
                stack.Push(tempLeft);
                continue;
            }
            
            Node tempRight = item.Right;
            if(tempRight != null && !tempRight.IsVisited) {
                stack.Push(tempRight);
                continue;
            }
            
            item.IsVisited = true;
        }
        else {
            item.IsVisited = true;
            if(IsLeaveElement(item)) {
                foreach(var value in stack) {
                    Console.Write(value.Value + " --> ");
                }
                Console.WriteLine();
            }
            stack.Pop();
        }
    }
}

Problem : Find the maximum depth in a given binary tree?

Output : 4 (20 –> 9 –> 12 –> 15)

Solution : If we consider the root node as starting point, then maximum depth from root node is maximum of depth values from root left sub-tree & root right sub-tree.

Code

void Main()
{
    Node n20 = new Node(20);
    n20.Left = new Node(9);
    n20.Left.Left = new Node(5);
    n20.Left.Right = new Node(12);
    n20.Left.Right.Right = new Node(15);
    n20.Right = new Node(49);
    n20.Right.Left = new Node(23);
    n20.Right.Right = new Node(52);
    n20.Right.Right.Left = new Node(50);
    
    GetMaxDepth(n20).Dump();
}

public class Node
{
    public Node Left {get; set;}
    public Node Right {get; set;}
    public int Value {get;set;}
    
    public Node(int value)
    {
        this.Value = value;
    }
}

public static int GetMaxDepth(Node node)
{
    if(node == null) return 0;
    
    return Math.Max(1 + GetMaxDepth(node.Left), 1 + GetMaxDepth(node.Right));
}

Contact Me

rk.pawan@gmail.com | +1-737-202-7676 | LinkedIn | Facebook | Github |

No Comments

Add a Comment

As it will appear on the website

Not displayed

Your website