private static TreeNode CreateTree(Node current) { if (current == null) { return null; } var root = new TreeNode { value = current.value }; var currentT = root; current = current.next; int i = 1; var treeQueue = new Queue<TreeNode>(); while (current != null) { var treeNode = new TreeNode { value = current.value }; current = current.next; if (i == 1) { currentT.left = treeNode; treeQueue.Enqueue(currentT.left); i++; } else if (i == 2) { currentT.right = treeNode; treeQueue.Enqueue(currentT.right); i++; } if(i >= 3) { i = 1; currentT = treeQueue.Dequeue(); } } return root; }
private static TreeNode CreateTreeFromInorderPreorder(List<int> inorderList, List<int> preorderList, ref int preorderIndex) { if (!inorderList.Any() || !preorderList.Any() || preorderIndex >= preorderList.Count) { return null; } preorderIndex = preorderIndex + 1; var root = new TreeNode { value = preorderList[preorderIndex] }; var rootIndex = inorderList.IndexOf(preorderList[preorderIndex]); var inorderLeft = inorderList.Where((value, index) => index < rootIndex).ToList(); var inorderRight = inorderList.Where((value, index) => index > rootIndex).ToList(); //var preorderLeft = preorderList.Where(inorderLeft.Contains).ToList(); //var preorderRight = preorderList.Where(inorderRight.Contains).ToList(); root.left = CreateTreeFromInorderPreorder(inorderLeft, preorderList, ref preorderIndex); root.right = CreateTreeFromInorderPreorder(inorderRight, preorderList, ref preorderIndex); return root; }
private static void PrintTreePreOrder(TreeNode head) { if (head == null) { return; } Console.Write(head.value + " "); PrintTreePreOrder(head.left); PrintTreePreOrder(head.right); }
private static void PrintTreeLevelByLevel(TreeNode head) { var nodeQueue = new Queue<TreeNode>(); nodeQueue.Enqueue(head); while (nodeQueue.Count > 0) { var tempQueue = new Queue<TreeNode>(); while (nodeQueue.Count > 0) { var node = nodeQueue.Dequeue(); if (node != null) { Console.Write(node.value + " "); tempQueue.Enqueue(node.left); tempQueue.Enqueue(node.right); } } Console.WriteLine(); nodeQueue = tempQueue; } }
private static void PrintTree(TreeNode root) { Console.WriteLine("Preorder "); PrintTreePreOrder(root); Console.WriteLine(); Console.WriteLine("Inorder "); PrintTreeInOrder(root); Console.WriteLine(); Console.WriteLine("PostOrder "); PrintTreePostOrder(root); Console.WriteLine(); Console.WriteLine("Print level by level "); PrintTreeLevelByLevel(root); Console.WriteLine(); }
private static bool IsBST(TreeNode node) { if (node != null) { var left = node.left != null ? node.left.value : int.MinValue; var right = node.right != null ? node.right.value : int.MaxValue; if (left > node.value || node.value > right) { return false; } return IsBST(node.left) && IsBST(node.right); } return true; }
private static void InsertBST(ref TreeNode root, int value) { if (root == null) { root = new TreeNode { value = value }; return; } if (root.value <= value) { InsertBST(ref root.right, value); } else { InsertBST(ref root.left, value); } }
private static TreeNode GetLowestCommonAncestor(TreeNode root, int input1, int input2) { if (root == null) { return null; } if (root.value >= input1 && root.value <= input2) { return root; } if (root.value < input1 && root.value < input2) { return GetLowestCommonAncestor(root.right, input1, input2); } return GetLowestCommonAncestor(root.left, input1, input2); }