/// <summary> /// Reconstruct connected node a,b,c and their childrens. /// 将相连的三个顶点和其子孙连进行重构 /// </summary> /// <returns>新的祖先,即<paramref name="b"/></returns> /// <remarks> /// after reconstruction: /// 重构以后的形状 /// b /// / \ /// a c /// / \ / \ /// t0 t1 t2 t3 /// </remarks> protected static BinaryTreeNode Connect34(BinaryTreeNode a, BinaryTreeNode b, BinaryTreeNode c, BinaryTreeNode t0, BinaryTreeNode t1, BinaryTreeNode t2, BinaryTreeNode t3, BinaryTreeNode top) { Contract.Requires <ArgumentNullException>(a != null); Contract.Requires <ArgumentNullException>(b != null); Contract.Requires <ArgumentNullException>(c != null); Contract.Ensures(a.LeftChild == t0); Contract.Ensures(a.RightChild == t1); Contract.Ensures(c.LeftChild == t2); Contract.Ensures(c.RightChild == t3); Contract.Ensures(b.LeftChild == a); Contract.Ensures(b.RightChild == c); Contract.EndContractBlock(); top.TransferParent(b); a.LeftChild = t0; a.RightChild = t1; a.SearchUp(true); c.LeftChild = t2; c.RightChild = t3; c.SearchUp(true); b.LeftChild = a; b.RightChild = c; b.SearchUp(); return(b); }
/// <summary> /// 用<paramref name="replace"/>子树替换<paramref name="target"/>结点 /// </summary> /// <param name="target">被替换结点</param> /// <param name="replace">替换的结点</param> protected void Transplant(BinaryTreeNode target, BinaryTreeNode replace) { Contract.Requires <ArgumentNullException>(target != null); if (target == replace) { return; } target.Parent.SearchDown(); target.TransferParent(replace); replace.SearchUp(); }