private int GetTree(ChallengeTreeNode parent, string data, int index) { //this function should always be called on an opening backet index = AdvanceString(index, "("); var nextSymbol = GetNextSymbol(data, index); if (nextSymbol != ",") { parent.left = new ChallengeTreeNode(int.Parse(nextSymbol)); index = AdvanceString(index, nextSymbol); if (GetNextSymbol(data, index) == "(") { index = GetTree(parent.left, data, index); } } //here, we should find a comma index = AdvanceString(index, ","); nextSymbol = GetNextSymbol(data, index); if (nextSymbol != ")") { parent.right = new ChallengeTreeNode(int.Parse(nextSymbol)); index = AdvanceString(index, nextSymbol); if (GetNextSymbol(data, index) == "(") { index = GetTree(parent.right, data, index); } } //here, we should find a right bracket index = AdvanceString(index, ")"); //last thing, return our data string return(index); }
public static ChallengeTreeNode MakeTreeFromString(string s) { var entries = s.Split(',').Select(r => r.Trim()).ToList(); Queue <ChallengeTreeNode> nodes = new Queue <ChallengeTreeNode>(); var root = new ChallengeTreeNode(int.Parse(entries[0])); nodes.Enqueue(root); for (var i = 1; i < entries.Count; i += 2) { var node = nodes.Dequeue(); var valLeft = entries[i]; var valRight = entries[i + 1]; if (valLeft != "null") { var leftNode = new ChallengeTreeNode(int.Parse(valLeft)); node.left = leftNode; nodes.Enqueue(leftNode); } if (valRight != "null") { var rightNode = new ChallengeTreeNode(int.Parse(valRight)); node.right = rightNode; nodes.Enqueue(rightNode); } } return(root); }
// Encodes a tree to a single string. public string serialize(ChallengeTreeNode root) { if (root == null) { return(""); } var builder = new StringBuilder(); GetString(root, builder); return(builder.ToString()); }
private void GetString(ChallengeTreeNode node, StringBuilder builder) { builder.Append(node.val); if (node.left == null && node.right == null) { return; } builder.Append('('); if (node.left != null) { GetString(node.left, builder); } builder.Append(','); if (node.right != null) { GetString(node.right, builder); } builder.Append(')'); }
// Decodes your encoded data to tree. public ChallengeTreeNode deserialize(string data) { if (string.IsNullOrEmpty(data)) { return(null); } var rootVal = GetNextSymbol(data, 0); var root = new ChallengeTreeNode(int.Parse(rootVal)); var index = AdvanceString(0, rootVal); if (index == data.Length) { return(root); } GetTree(root, data, index); return(root); }
private ChallengeTreeNode ConstructNode(Stack <int> preorderStack, List <int> inorderList) { var nodeVal = preorderStack.Pop(); var valInorderIndex = inorderList.IndexOf(nodeVal); var inorderLeft = inorderList.GetRange(0, valInorderIndex); var inorderRight = inorderList.GetRange(valInorderIndex + 1, inorderList.Count - valInorderIndex - 1); var node = new ChallengeTreeNode(nodeVal); if (inorderLeft.Count != 0) { node.left = ConstructNode(preorderStack, inorderLeft); } if (inorderRight.Count != 0) { node.right = ConstructNode(preorderStack, inorderRight); } return(node); }
public NodeAndVal(ChallengeTreeNode root, int val) { Root = root; Val = val; }