コード例 #1
0
        public static BinaryTreeNodeWithParent <int> LCA(BinaryTreeNodeWithParent <int> node0,
                                                         BinaryTreeNodeWithParent <int> node1)
        {
            var hash = new HashSet <BinaryTreeNodeWithParent <int> >();

            while (node0 != null || node1 != null)
            {
                // Ascend tree in tandem from these two nodes.
                if (node0 != null)
                {
                    if (!hash.Add(node0))
                    {
                        return(node0);
                    }

                    node0 = node0.Parent;
                }

                if (node1 != null)
                {
                    if (!hash.Add(node1))
                    {
                        return(node1);
                    }

                    node1 = node1.Parent;
                }
            }

            throw new ArgumentException("node0 and node1 are not in the same tree");
        }
コード例 #2
0
        public void LCA()
        {
            var A = new BinaryTreeNodeWithParent <int>()
            {
                Data = 314
            };
            var B = new BinaryTreeNodeWithParent <int>()
            {
                Data = 6
            };
            var C = new BinaryTreeNodeWithParent <int>()
            {
                Data = 271
            };
            var D = new BinaryTreeNodeWithParent <int>()
            {
                Data = 28
            };
            var E = new BinaryTreeNodeWithParent <int>()
            {
                Data = 0
            };
            var F = new BinaryTreeNodeWithParent <int>()
            {
                Data = 561
            };
            var G = new BinaryTreeNodeWithParent <int>()
            {
                Data = 3
            };
            var H = new BinaryTreeNodeWithParent <int>()
            {
                Data = 17
            };
            var I = new BinaryTreeNodeWithParent <int>()
            {
                Data = 6
            };
            var J = new BinaryTreeNodeWithParent <int>()
            {
                Data = 2
            };
            var K = new BinaryTreeNodeWithParent <int>()
            {
                Data = 1
            };
            var L = new BinaryTreeNodeWithParent <int>()
            {
                Data = 401
            };
            var M = new BinaryTreeNodeWithParent <int>()
            {
                Data = 641
            };
            var N = new BinaryTreeNodeWithParent <int>()
            {
                Data = 257
            };
            var O = new BinaryTreeNodeWithParent <int>()
            {
                Data = 271
            };
            var P = new BinaryTreeNodeWithParent <int>()
            {
                Data = 28
            };

            B.Parent = A;
            I.Parent = A;
            C.Parent = B;
            F.Parent = B;
            D.Parent = C;
            E.Parent = C;
            G.Parent = F;
            H.Parent = G;
            J.Parent = I;
            O.Parent = I;
            K.Parent = J;
            L.Parent = K;
            N.Parent = K;
            M.Parent = L;
            P.Parent = O;

            var result = Solution.LCA(M, N);

            result.Data.Should().Be(K.Data);
        }