예제 #1
0
파일: BFS.cs 프로젝트: Roiw/LeetCode
        public static TreeNode Search(TreeNode root, int value)
        {
            Queue <TreeNode> toSearch = new Queue <TreeNode>();

            toSearch.Enqueue(root);
            while (toSearch.Count > 0)
            {
                TreeNode current = toSearch.Dequeue();
                if (current.Value == value)
                {
                    return(current);
                }
                else
                {
                    if (current.Left != null)
                    {
                        toSearch.Enqueue(current.Left);
                    }
                    if (current.Right != null)
                    {
                        toSearch.Enqueue(current.Right);
                    }
                }
            }
            return(null);
        }
예제 #2
0
파일: Question05.cs 프로젝트: jboyer87/CTCI
        public static DataStructures.Node <T> GetNodeAtBeginningOfLoop <T>(
            DataStructures.LinkedList <T> linkedList)
        {
            if (linkedList.Head == null)
            {
                throw new ArgumentException("Cannot evaluate an empty list.");
            }

            DataStructures.Node <T> slowRunner = linkedList.Head;
            DataStructures.Node <T> fastRunner = linkedList.Head;


            while (true)
            {
                // Jump ahead one
                slowRunner = slowRunner.Next;

                if (fastRunner.Next != null)
                {
                    // Jump ahead two
                    fastRunner = fastRunner.Next.Next;
                }
                else
                {
                    throw new ArgumentException("List does not have a loop.");
                }

                if (slowRunner == fastRunner)
                {
                    return(slowRunner);
                }
            }
        }
 //--------------------------------------------------------------------
 private void _AssertCountingVisitor(DataStructures.Node Node, DataStructures.VisitationType VisitType, int ExpectedCount)
 {
     //Console.WriteLine( "Testing VisitNodes( " + VisitType.ToString() + " )." );
     DataStructures.Node.CountingVisitor visitor = new DataStructures.Node.CountingVisitor();
     Node.VisitNodes(visitor, VisitType);
     Assert.AreEqual(ExpectedCount, visitor.Count, "Visitor count mismatch after VisitNodes( " + VisitType.ToString() + " ).");
 }
예제 #4
0
        public static TreeNode Search(TreeNode root, int value)
        {
            // Found..
            if (root.Value == value)
            {
                return(root);
            }

            // Base case..
            if (root.Left == null && root.Right == null)
            {
                return(null);
            }

            TreeNode next = null;

            if (root.Left != null)
            {
                next = Search(root.Left, value);
            }

            if (next != null)
            {
                return(next);
            }

            if (root.Right != null)
            {
                next = Search(root.Right, value);
            }

            return(next);
        }
예제 #5
0
 public void Test_10_Navigation()
 {
     DataStructures.Node root = new DataStructures.Node();
     NodeTestData.AddTestChildren(root);
     NodeTestData.AssertTestChildren(root);
     return;
 }
예제 #6
0
 public void Test_00_TextGraph()
 {
     DataStructures.Node root = new DataStructures.Node();
     NodeTestData.AddTestChildren(root);
     Console.WriteLine(root.TextGraph());
     return;
 }
    //--------------------------------------------------------------------
    public static void AddTestChildren(DataStructures.Node root)
    {
        // D3 = C2.Prev        A1
        // C3 = C2.Next         +- B1
        // A1 = C1.First        |   +- C1
        // C7 = C1.Last         |   |   +- D1
        // A1 = C1.Root         |   |   +- D2
        // B1 = C1.Parent       |   |   +- D3
        // C1 = C2.PrevSib      |   +- C2
        // C2 = C1.NextSib      |   +- C3
        // C1 = C1.FirstSib     +- B2
        // C3 = C1.LastSib      |   +- C4
        // B1 = A1.FirstChild   |   +- C5
        // B3 = A1.LastChild    |   +- C6
        // B1 = A1.FirstDesc    +- B3
        // C7 = A1.LastDesc         +- C7

        DataStructures.Node A1 = new DataStructures.Node("A1", "A1", null);
        DataStructures.Node B1 = new DataStructures.Node("B1", "B1", null);
        DataStructures.Node B2 = new DataStructures.Node("B2", "B2", null);
        DataStructures.Node B3 = new DataStructures.Node("B3", "B3", null);
        DataStructures.Node C1 = new DataStructures.Node("C1", "C1", null);
        DataStructures.Node C2 = new DataStructures.Node("C2", "C2", null);
        DataStructures.Node C3 = new DataStructures.Node("C3", "C3", null);
        DataStructures.Node C4 = new DataStructures.Node("C4", "C4", null);
        DataStructures.Node C5 = new DataStructures.Node("C5", "C5", null);
        DataStructures.Node C6 = new DataStructures.Node("C6", "C6", null);
        DataStructures.Node C7 = new DataStructures.Node("C7", "C7", null);
        DataStructures.Node D1 = new DataStructures.Node("D1", "D1", null);
        DataStructures.Node D2 = new DataStructures.Node("D2", "D2", null);
        DataStructures.Node D3 = new DataStructures.Node("D3", "D3", null);

        root.AddChild(A1, -1, false);
        {
            A1.AddChild(B1, -1, false);
            {
                B1.AddChild(C1, -1, false);
                {
                    C1.AddChild(D1, -1, false);
                    C1.AddChild(D2, -1, false);
                    C1.AddChild(D3, -1, false);
                }
                B1.AddChild(C2, -1, false);
                B1.AddChild(C3, -1, false);
            }
            A1.AddChild(B2, -1, false);
            {
                B2.AddChild(C4, -1, false);
                B2.AddChild(C5, -1, false);
                B2.AddChild(C6, -1, false);
            }
            A1.AddChild(B3, -1, false);
            {
                B3.AddChild(C7, -1, false);
            }
        }

        return;
    }
예제 #8
0
 public void Test_20_Clone()
 {
     DataStructures.Node root = new DataStructures.Node();
     NodeTestData.AddTestChildren(root);
     DataStructures.Node.CloningVisitor visitor = new DataStructures.Node.CloningVisitor(root);
     root.VisitNodes(visitor, DataStructures.VisitationType.DecendentsDepthFirst);
     NodeTestData.AssertTestChildren(visitor.TargetRoot);
     return;
 }
	public void Test_00_DebugOutput()
	{
		DataStructures.Node root = new DataStructures.Node( "", "", new DebugOutputNodeListener() );
		root.Value = "root";
		root.Notify(
			new DataStructures.Node.NodeUpdateNotification(
				DataStructures.Node.NodeNotification.NotificationStatus.Completed
				, root ) );
		NodeTestData.AddTestChildren( root );
		return;
	}
예제 #10
0
        public static void RemoveNodeFromList(ref DataStructures.Node <T> node)
        {
            if (node.Next == null)
            {
                throw new ArgumentException("Cannot delete node using this method - next " +
                                            "element is null");
            }

            T nextNodeValue = node.Next.Value;

            node.Value = nextNodeValue;

            node.Next = node.Next.Next;
        }
    //--------------------------------------------------------------------
    public static void JumbleTestChildren(DataStructures.Node root)
    {
        DataStructures.Node child = null;

        child = root.FindDescNode("C1");
        child.ClearChildren(false);
        child.AddChild(new DataStructures.Node("D1", "D1", null), -1, false);
        child.AddChild(new DataStructures.Node("D2", "D2", null), -1, false);
        child.AddChild(new DataStructures.Node("D3", "D3", null), -1, false);

        child = root.FindDescNode("C5");
        child.ClearChildren(false);

        return;
    }
    public void Test_10_CountingVisitorOnRoot()
    {
        DataStructures.Node root = new DataStructures.Node();
        NodeTestData.AddTestChildren(root);

        this._AssertCountingVisitor(root, DataStructures.VisitationType.None, 0);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.Parents, 0);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.PreviousSiblings, 0);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.NextSiblings, 0);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.PreviousNodes, 0);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.NextNodes, 14);
        this._AssertCountingVisitor(root, DataStructures.VisitationType.Children, 1);
        // Not Implemented: this._AssertCountingVisitor( root, DataStructures.VisitationType.DecendentsBreadthFirst, 0 );
        this._AssertCountingVisitor(root, DataStructures.VisitationType.DecendentsDepthFirst, 14);

        return;
    }
 //--------------------------------------------------------------------
 public static void AssertTestChildren(DataStructures.Node root)
 {
     Assert.AreEqual("D3", root.FindDescNode("C2").PrevNode.Value.ToString(), "D3 = C2.Prev");
     Assert.AreEqual("C3", root.FindDescNode("C2").NextNode.Value.ToString(), "C3 = C2.Next");
     Assert.AreEqual("A1", root.FindDescNode("C1").FirstNode.FirstChildNode.Value.ToString(), "A1 = C1.First.FirstChild");           // Special case.
     Assert.AreEqual("C7", root.FindDescNode("C1").LastNode.Value.ToString(), "C7 = C1.Last");
     Assert.AreEqual("A1", root.FindDescNode("C1").RootNode.FirstChildNode.Value.ToString(), "A1 = C1.Root.FirstChild");             // Special case.
     Assert.AreEqual("B1", root.FindDescNode("C1").ParentNode.Value.ToString(), "B1 = C1.Parent");
     Assert.AreEqual("C1", root.FindDescNode("C2").PrevSibNode.Value.ToString(), "C1 = C2.PrevSib");
     Assert.AreEqual("C2", root.FindDescNode("C1").NextSibNode.Value.ToString(), "C2 = C1.NextSib");
     Assert.AreEqual("C1", root.FindDescNode("C1").FirstSibNode.Value.ToString(), "C1 = C1.FirstSib");
     Assert.AreEqual("C3", root.FindDescNode("C1").LastSibNode.Value.ToString(), "C3 = C1.LastSib");
     Assert.AreEqual("B1", root.FindDescNode("A1").FirstChildNode.Value.ToString(), "B1 = A1.FirstChild");
     Assert.AreEqual("B3", root.FindDescNode("A1").LastChildNode.Value.ToString(), "B3 = A1.LastChild");
     Assert.AreEqual("B1", root.FindDescNode("A1").FirstDescNode.Value.ToString(), "B1 = A1.FirstDesc");
     Assert.AreEqual("C7", root.FindDescNode("A1").LastDescNode.Value.ToString(), "C7 = A1.LastDesc");
     return;
 }
예제 #14
0
        public static DataStructures.LinkedList <int> AddLinkedLists(
            DataStructures.LinkedList <int> first,
            DataStructures.LinkedList <int> second)
        {
            if (first.Head == null && second.Head == null)
            {
                return(null);
            }

            var summedLists  = new DataStructures.LinkedList <int>();
            var summedRunner = new DataStructures.Node <int>(0);

            summedLists.Head = summedRunner;

            DataStructures.Node <int> firstRunner  = first.Head;
            DataStructures.Node <int> secondRunner = second.Head;

            bool carry = false;

            while (firstRunner != null || secondRunner != null)
            {
                var newNode = new DataStructures.Node <int>(0);

                int sum = 0;

                if (carry)
                {
                    sum++;
                }

                if (firstRunner == null)
                {
                    sum += secondRunner.Value;
                }
                else if (secondRunner == null)
                {
                    sum += firstRunner.Value;
                }
                else
                {
                    sum += firstRunner.Value + secondRunner.Value;
                }

                carry = false;

                if (sum >= 10)
                {
                    sum  -= 10;
                    carry = true;
                }

                summedRunner.Value = sum;

                summedRunner.Next = newNode;
                summedRunner      = summedRunner.Next;

                firstRunner  = firstRunner == null ? null : firstRunner.Next ?? null;
                secondRunner = secondRunner == null ? null : secondRunner.Next ?? null;
            }

            return(summedLists);
        }