## C# || CombinationIterator – How To Implement Iterator For Combination Using C#

The following is a module with functions which demonstrates how to implement iterator for combination using C#.

1. Combination Iterator – Problem Statement

Design the CombinationIterator class:

• CombinationIterator(string characters, int combinationLength) Initializes the object with a string characters of sorted distinct lowercase English letters and a number combinationLength as arguments.
• next() Returns the next combination of length combinationLength in lexicographical order.
• hasNext() Returns true if and only if there exists a next combination.

Example 1:

``` Input Input: ["CombinationIterator", "next", "hasNext", "next", "hasNext", "next", "hasNext"] [["abc", 2], [], [], [], [], [], []] Output: [null, "ab", true, "ac", true, "bc", false]```

``` ```

```Explanation: CombinationIterator itr = new CombinationIterator("abc", 2); itr.next(); // return "ab" itr.hasNext(); // return True itr.next(); // return "ac" itr.hasNext(); // return True itr.next(); // return "bc" itr.hasNext(); // return False ```

2. Combination Iterator – Solution

The following is a solution which demonstrates how to implement iterator for combination.

The following solution uses backtracking to generate combinations.

``` 2. Combination Iterator - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Nov 20, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Demonstrates how to implement iterator for combination // ============================================================================ public class CombinationIterator { Queue<string> combinations; public CombinationIterator(string characters, int combinationLength) { combinations = new Queue<string>(); Generate(characters, combinationLength, 0, new StringBuilder()); } private void Generate(string characters, int combinationLength, int startIndex, StringBuilder currentCombo) { if (currentCombo.Length == combinationLength) { combinations.Enqueue(currentCombo.ToString()); return; } for (int index = startIndex; index < characters.Length; ++index) { // Add this item to the combination currentCombo.Append(characters[index]); // Keep generating permutations Generate(characters, combinationLength, index + 1, currentCombo); // Remove last item as its already been explored currentCombo.Remove(currentCombo.Length - 1, 1); } } public string Next() { return combinations.Dequeue(); } public bool HasNext() { return combinations.Count > 0; } }// http://programmingnotes.org/ 1234567891011121314151617181920212223242526272829303132333435363738394041 // ============================================================================//    Author: Kenneth Perkins//    Date:   Nov 20, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Demonstrates how to implement iterator for combination// ============================================================================public class CombinationIterator {    Queue<string> combinations;     public CombinationIterator(string characters, int combinationLength) {        combinations = new Queue<string>();        Generate(characters, combinationLength, 0, new StringBuilder());    }     private void Generate(string characters, int combinationLength, int startIndex, StringBuilder currentCombo) {        if (currentCombo.Length == combinationLength) {            combinations.Enqueue(currentCombo.ToString());            return;        }         for (int index = startIndex; index < characters.Length; ++index) {            // Add this item to the combination            currentCombo.Append(characters[index]);             // Keep generating permutations            Generate(characters, combinationLength, index + 1, currentCombo);             // Remove last item as its already been explored            currentCombo.Remove(currentCombo.Length - 1, 1);        }    }     public string Next() {        return combinations.Dequeue();    }     public bool HasNext() {        return combinations.Count > 0;    }}// http://programmingnotes.org/ ```

QUICK NOTES:
The highlighted lines are sections of interest to look out for.

The code is heavily commented, so no further insight is necessary. If you have any questions, feel free to leave a comment below.

Once compiled, you should get this as your output for the example cases:

``` [null,"ab",true,"ac",true,"bc",false] ```

## C# || How To Construct Binary Tree From Preorder And Inorder Traversal Using C#

The following is a module with functions which demonstrates how to construct a binary tree from pre order and in order traversal using C#.

1. Build Tree – Problem Statement

Given two integer arrays preorder and inorder where preorder is the preorder traversal of a binary tree and inorder is the inorder traversal of the same tree, construct and return the binary tree.

Example 1:

``` Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7] ```

Example 2:

``` Input: preorder = [-1], inorder = [-1] Output: [-1] ```

2. Build Tree – Solution

The following is a solution which demonstrates how to construct a binary tree from pre order and in order traversal.

``` 2. Build Tree - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Nov 20, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Demonstrates how to build binary tree from pre order and in order // ============================================================================ /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { * this.val = val; * this.left = left; * this.right = right; * } * } */ public class Solution { private int preorderIndex; private Dictionary<int, int> inorderIndexMap; public TreeNode BuildTree(int[] preorder, int[] inorder) { preorderIndex = 0; // Build a hashmap to store value -> its index relations inorderIndexMap = new Dictionary<int, int>(); for (int index = 0; index < inorder.Length; ++index) { inorderIndexMap[inorder[index]] = index; } return ArrayToTree(preorder, 0, preorder.Length - 1); } private TreeNode ArrayToTree(int[] preorder, int start, int end) { // If there are no elements to construct the tree if (start > end) { return null; } // Select the preorder_index element as the root and increment it var rootValue = preorder[preorderIndex++]; var root = new TreeNode(rootValue); // Get current positon var curPos = inorderIndexMap[rootValue]; // Build left and right subtree // excluding inorderIndexMap[rootValue] element because it's the root root.left = ArrayToTree(preorder, start, curPos - 1); root.right = ArrayToTree(preorder, curPos + 1, end); return root; } }// http://programmingnotes.org/ 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 // ============================================================================//    Author: Kenneth Perkins//    Date:   Nov 20, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Demonstrates how to build binary tree from pre order and in order// ============================================================================/** * Definition for a binary tree node. * public class TreeNode { *     public int val; *     public TreeNode left; *     public TreeNode right; *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */public class Solution {    private int preorderIndex;    private Dictionary<int, int> inorderIndexMap;     public TreeNode BuildTree(int[] preorder, int[] inorder) {        preorderIndex = 0;         // Build a hashmap to store value -> its index relations        inorderIndexMap = new Dictionary<int, int>();        for (int index = 0; index < inorder.Length; ++index) {            inorderIndexMap[inorder[index]] = index;        }        return ArrayToTree(preorder, 0, preorder.Length - 1);    }     private TreeNode ArrayToTree(int[] preorder, int start, int end) {        // If there are no elements to construct the tree        if (start > end) {            return null;        }         // Select the preorder_index element as the root and increment it        var rootValue = preorder[preorderIndex++];        var root = new TreeNode(rootValue);         // Get current positon        var curPos = inorderIndexMap[rootValue];         // Build left and right subtree        // excluding inorderIndexMap[rootValue] element because it's the root        root.left = ArrayToTree(preorder, start, curPos - 1);        root.right = ArrayToTree(preorder, curPos + 1, end);        return root;    }}// http://programmingnotes.org/ ```

QUICK NOTES:
The highlighted lines are sections of interest to look out for.

The code is heavily commented, so no further insight is necessary. If you have any questions, feel free to leave a comment below.

Once compiled, you should get this as your output for the example cases:

``` [3,9,20,null,null,15,7] [-1] ```

## C# || How To Construct Binary Tree From Inorder And Postorder Traversal Using C#

The following is a module with functions which demonstrates how to construct a binary tree from in order and post order traversal using C#.

1. Build Tree – Problem Statement

Given two integer arrays inorder and postorder where inorder is the inorder traversal of a binary tree and postorder is the postorder traversal of the same tree, construct and return the binary tree.

Example 1:

``` Input: inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] Output: [3,9,20,null,null,15,7] ```

Example 2:

``` Input: inorder = [-1], postorder = [-1] Output: [-1] ```

2. Build Tree – Solution

The following is a solution which demonstrates how to construct a binary tree from in order and post order traversal.

``` 2. Build Tree - Solution C# // ============================================================================ // Author: Kenneth Perkins // Date: Nov 20, 2021 // Taken From: http://programmingnotes.org/ // File: Solution.cs // Description: Demonstrates how to build binary tree from in order and post order // ============================================================================ /** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNode left; * public TreeNode right; * public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { * this.val = val; * this.left = left; * this.right = right; * } * } */ public class Solution { private int postorderIndex; private Dictionary<int, int> inorderIndexMap; public TreeNode BuildTree(int[] inorder, int[] postorder) { postorderIndex = postorder.Length - 1; // Build a map to store value & its index relation inorderIndexMap = new Dictionary<int, int>(); for (int index = 0; index < inorder.Length; ++index) { inorderIndexMap[inorder[index]] = index; } return ArrayToTree(postorder, 0, postorder.Length - 1); } private TreeNode ArrayToTree(int[] postorder, int start, int end) { // If there are no elements to construct the tree if (start > end) { return null; } // Select the postorder element as the root and decrement it var rootValue = postorder[postorderIndex--]; var root = new TreeNode(rootValue); // Get current positon var curPos = inorderIndexMap[rootValue]; // Build left and right subtree // excluding inorderIndexMap[rootValue] element because it's the root root.right = ArrayToTree(postorder, curPos + 1, end); root.left = ArrayToTree(postorder, start, curPos - 1); return root; } }// http://programmingnotes.org/ 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 // ============================================================================//    Author: Kenneth Perkins//    Date:   Nov 20, 2021//    Taken From: http://programmingnotes.org///    File:  Solution.cs//    Description: Demonstrates how to build binary tree from in order and post order// ============================================================================/** * Definition for a binary tree node. * public class TreeNode { *     public int val; *     public TreeNode left; *     public TreeNode right; *     public TreeNode(int val=0, TreeNode left=null, TreeNode right=null) { *         this.val = val; *         this.left = left; *         this.right = right; *     } * } */public class Solution {    private int postorderIndex;    private Dictionary<int, int> inorderIndexMap;     public TreeNode BuildTree(int[] inorder, int[] postorder) {        postorderIndex = postorder.Length - 1;         // Build a map to store value & its index relation        inorderIndexMap = new Dictionary<int, int>();        for (int index = 0; index < inorder.Length; ++index) {            inorderIndexMap[inorder[index]] = index;        }        return ArrayToTree(postorder, 0, postorder.Length - 1);    }     private TreeNode ArrayToTree(int[] postorder, int start, int end) {        // If there are no elements to construct the tree        if (start > end) {            return null;        }         // Select the postorder element as the root and decrement it        var rootValue = postorder[postorderIndex--];        var root = new TreeNode(rootValue);         // Get current positon        var curPos = inorderIndexMap[rootValue];         // Build left and right subtree        // excluding inorderIndexMap[rootValue] element because it's the root        root.right = ArrayToTree(postorder, curPos + 1, end);        root.left = ArrayToTree(postorder, start, curPos - 1);        return root;    }}// http://programmingnotes.org/ ```

QUICK NOTES:
The highlighted lines are sections of interest to look out for.

The code is heavily commented, so no further insight is necessary. If you have any questions, feel free to leave a comment below.

Once compiled, you should get this as your output for the example cases:

``` [3,9,20,null,null,15,7] [-1] ```