コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        // 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());
        }
コード例 #4
0
 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(')');
 }
コード例 #5
0
        // 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);
        }
コード例 #7
0
 public NodeAndVal(ChallengeTreeNode root, int val)
 {
     Root = root;
     Val  = val;
 }