using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace HelloWorld
{
	public class Program
	{
		public static void Main(string[] args)
		{
			Node root = CreateTree();
			
			/*Console.WriteLine();
			Console.WriteLine("========Height of Binary Tree==========");
			Console.WriteLine(HeightOfBinaryTree(root));
			
			Console.WriteLine();
			Console.WriteLine("========PrintInorder==========");
			PrintInorder(root);
			
			Console.WriteLine();
			Console.WriteLine("========SIZE-No of Nodes==========");
			Console.WriteLine(Convert.ToInt16(SizeOfTree(root)));
			
			Console.WriteLine();
			Console.WriteLine("=========MAX==========");
			//Console.WriteLine(Convert.ToInt16(MaxValueInTree(root)));
			
			Console.WriteLine();
			Console.WriteLine("==========MIN==========");
			//Console.WriteLine(Convert.ToInt16(MinValueInTree(root)));
			
			Console.WriteLine();
			Console.WriteLine("==========LEVEL========");
			//PrintCurrentlevel(root, 3); // O(n^2)
			
			Console.WriteLine();
			Console.WriteLine("========ALL LEVELS========");
			PrintLevelOrder(root);
			
			Console.WriteLine();
			Console.WriteLine("========ALL LEVELS ON Different Lines========");
			PrintLevelOrderSameAsTree(root);
			
			Console.WriteLine();
			Console.WriteLine("========Print Left view using ref int========");
			PrintLeftViewOfTreeUsingArrayList(root);
			
			Console.WriteLine();
			Console.WriteLine("========Print Right view using ref int========");
			PrintRightViewOfTreeUsingArrayList(root);
			
			Console.WriteLine();
			Console.WriteLine("========Top view of BT========");
			*/
			BinaryTree bt = new BinaryTree();
			bt.root = new Node(1);
			bt.root.left = new Node(2);
      bt.root.right = new Node(3);
      bt.root.left.right = new Node(4);
      bt.root.left.right.right = new Node(5);
      bt.root.left.right.right.right = new Node(6);
      bt.TopView();
		}
		
		public static int HeightOfBinaryTree(Node root)
		{
		  if (root == null)
		    return 0;
		    
		    return Math.Max(HeightOfBinaryTree(root.left),  HeightOfBinaryTree(root.right)) + 1;
		}
		
		public static int SizeOfTree(Node root)
		{
		  if (root == null)
		    return 0;
		    
		    return SizeOfTree(root.left) + SizeOfTree(root.right) + 1;
		}
		
		public static void PrintInorder(Node root)
		{
		  if (root == null)
		    return;
		    
		    PrintInorder(root.left);
		    Console.Write(root.data + " ");
		    PrintInorder(root.right);
		}
		
		public static Node CreateTree()
    {
    	Node root  = null;
        
        Console.WriteLine("Enter Node data: ");
        int data = Convert.ToInt16(Console.ReadLine());
        Console.WriteLine(data);
        if(data == -1) return null;
        
        root = new Node(data);
        Console.WriteLine("Enter left Node data for : " + data);
        root.left = CreateTree();
        Console.WriteLine("Enter right Node data for : " + data);
        root.right = CreateTree();
        return root;
    }
		
		public static int MaxValueInTree(Node root)
		{
		  if (root == null)
		    return Int32.MinValue;
		    
		    return Math.Max(root.data, Math.Max(MaxValueInTree(root.left), MaxValueInTree(root.right)));
		}
		
		public static int MinValueInTree(Node root)
		{
		  if (root == null)
		    return Int32.MaxValue;
		    
		    return Math.Min(root.data, Math.Min(MinValueInTree(root.left), MinValueInTree(root.right)));
		}
		
		
		public static void PrintCurrentlevel(Node root, int level)
		{
		  if (root == null)
		      return;
		  
		  if(level == 1)
		    Console.WriteLine(root.data + " ");
		  else if (level > 1)
		  {
		    PrintCurrentlevel(root.left, level - 1);
		    PrintCurrentlevel(root.right, level -1);
		  }
		}
			
		public static void PrintLevelOrder(Node root)
		{
		  if (root == null)
		      return;
		  
		  Queue<Node> q = new Queue<Node>();
		  q.Enqueue(root);
		  
		  while(q.Count != 0)
		  {
		    Node n = q.Dequeue();
		    Console.Write(n.data + " ");
		    if(n.left != null)
		      q.Enqueue(n.left);
		    
		    if(n.right != null)
		      q.Enqueue(n.right);
		  }
		}
		
		public static void PrintLevelOrderSameAsTree(Node root)
		{
		  if (root == null)
		      return;
		  
		  Queue<Node> q = new Queue<Node>();
		  q.Enqueue(root);
		  q.Enqueue(null);
		  
		  while(q.Count != 0)
		  {
		    Node n = q.Dequeue();
		    if (n == null)
		    {
		      if (q.Count == 0)
		      {
		        return;
		      }
		      
		      q.Enqueue(null);
		      Console.WriteLine("");
		      continue;
		    }
		    
		    Console.Write(n.data + " ");
		    if(n.left != null)
		      q.Enqueue(n.left);
		    
		    if(n.right != null)
		      q.Enqueue(n.right);
		  }
		}
		
		public static void PrintLeftViewOfTreeUsingArrayList(Node root)
		{
		  int maxLevel = 0;
		  PrintLeftViewUtil(root, 1, ref maxLevel);
		}
		
		public static void PrintLeftViewUtil(Node root, int level, ref int maxLevel)
		{
		  if  (root ==  null) return;
		  
		  if (maxLevel < level)
		  {
		    Console.WriteLine(root.data + " ");
		    maxLevel = level;
		  }
		  
		  PrintLeftViewUtil(root.left, level + 1, ref maxLevel);
		  PrintLeftViewUtil(root.right, level + 1, ref maxLevel);
		}
		
		
		public static void PrintRightViewOfTreeUsingArrayList(Node root)
		{
		  int maxLevel = 0;
		  PrintRightViewUtil(root, 1, ref maxLevel);
		}
		
		public static void PrintRightViewUtil(Node root, int level, ref int maxLevel)
		{
		  if  (root ==  null) return;
		  
		  if (maxLevel < level)
		  {
		    Console.WriteLine(root.data + " ");
		    maxLevel = level;
		  }
		  
		  PrintRightViewUtil(root.right, level + 1, ref maxLevel);
		  PrintRightViewUtil(root.left, level + 1, ref maxLevel);
		}
	
	public class BinaryTree {
	  
	  public Node root;
	  
	  public BinaryTree()
	  {
	    this.root = null;
	  }
	  
	  public void TopView()
	  {
	     Queue<Pair> q = new Queue<Pair>();
	     var distValue = new SortedDictionary<int, int>();
	     
	     if (root == null) return;
	     
	     q.Enqueue(new Pair(0, root));
	     while (q.Count != 0)
	     {
	        Pair tmpNode = (Pair)q.Dequeue();
	        if (!distValue.ContainsKey(tmpNode.hd))
	        {
	          distValue.Add(tmpNode.hd, tmpNode.node.data);
	        }
	        
	        if (tmpNode.node.left != null)
	          q.Enqueue(new Pair(tmpNode.hd -1, tmpNode.node.left));
	          
	          if(tmpNode.node.right != null)
	          q.Enqueue(new Pair(tmpNode.hd +1, tmpNode.node.right));
	     }
	     
	     foreach(var entry in distValue.Values)
	     {
	       Console.WriteLine(entry + " ");
	     }
	  }
	}
	
	
	public class Pair {
	  public Node node;
	  public int hd;
	  
	  public Pair(int hd, Node node)
	  {
	    this.hd = hd;
	    this.node = node;
	  }
	}
	
  	public class Node
  	{
    	internal int data;
        
        public Node left;
        public Node right;
        
        public Node(int a)
        {
        	this.data = a;
        }
  	}
  	
	}
} 

C Sharp Online Compiler

Write, Run & Share C# code online using OneCompiler's C# online compiler for free. It's one of the robust, feature-rich online compilers for C# language, running on the latest version 8.0. Getting started with the OneCompiler's C# compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C# and start coding.

Read inputs from stdin

OneCompiler's C# online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.

using System;
 
namespace Sample
{
  class Test
    {
      public static void Main(string[] args)
       {
         string name;
         name = Console.ReadLine();
         Console.WriteLine("Hello {0} ", name);
	}
     }
}

About C Sharp

C# is a general purpose object-oriented programming language by Microsoft. Though initially it was developed as part of .net but later it was approved by ECMA and ISO standards.

You can use C# to create variety of applications, like web, windows, mobile, console applications and much more using Visual studio.

Syntax help

Data types

Data TypeDescriptionRangesize
intTo store integers-2,147,483,648 to 2,147,483,6474 bytes
doubleto store large floating point numbers with decimalscan store 15 decimal digits8 bytes
floatto store floating point numbers with decimalscan store upto 7 decimal digits4 bytes
charto store single characters-2 bytes
stringto stores text-2 bytes per character
boolto stores either true or false-1 bit

Variables

Syntax

datatype variable-name = value;

Loops

1. If-Else:

When ever you want to perform a set of operations based on a condition or set of few conditions IF-ELSE is used.

if(conditional-expression) {
   // code
} 
else {
   // code
}

You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.

2. Switch:

Switch is an alternative to If-Else-If ladder.

switch(conditional-expression) {    
case value1:    
 // code    
 break;  // optional  
case value2:    
 // code    
 break;  // optional  
...    
    
default:     
 // code to be executed when all the above cases are not matched;    
} 

3. For:

For loop is used to iterate a set of statements based on a condition.

for(Initialization; Condition; Increment/decrement) {
  // code  
} 

4. While:

While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.

while(condition) {
 // code 
}

5. Do-While:

Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.

do {
  // code 
} while (condition);

Arrays

Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.

Syntax

data-type[] array-name;

Methods

Method is a set of statements which gets executed only when they are called. Call the method name in the main function to execute the method.

Syntax

static void method-name() 
{
  // code to be executed
}