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); }