private int GetLength(TreeNodeWithParent a)
        {
            int len = 0;

            while (a != null)
            {
                len++;
                a = a.Parent;
            }
            return(len);
        }
        public TreeNodeWithParent GetCommonAncestor(TreeNodeWithParent root, TreeNodeWithParent a, TreeNodeWithParent b)
        {
            if (a == b)
            {
                return(a);
            }
            if (a.Parent == b)
            {
                return(b);
            }
            if (b.Parent == a)
            {
                return(a);
            }

            var lenA = GetLength(a);
            var lenB = GetLength(b);

            var lenDiff = System.Math.Abs(lenA - lenB);

            var shorter = lenA > lenB ? b : a;
            var longer  = lenA > lenB ? a : b;

            while (lenDiff > 0)
            {
                longer = longer.Parent;
                lenDiff--;
            }

            while (shorter != null && longer != null)
            {
                if (shorter == longer)
                {
                    return(shorter);
                }

                shorter = shorter.Parent;
                longer  = longer.Parent;
            }

            return(null);
        }