public static void ConstructRightSibling(BinaryTreeNodeWithNext <int> tree) { var leftStart = tree; while (leftStart != null && leftStart.Left != null) { PopulateLowerLevelNextField(leftStart); leftStart = leftStart.Left; } }
private static void PopulateLowerLevelNextField(BinaryTreeNodeWithNext <int> startNode) { var iter = startNode; while (iter != null) { // Populate left child’s next field. iter.Left.Next = iter.Right; // Populate right child’s next field if iter is not the last node of this // level. if (iter.Next != null) { iter.Right.Next = iter.Next.Left; } iter = iter.Next; } }
public void ConstructRightSibling() { var A = new BinaryTreeNodeWithNext <int> { Data = 1 }; var B = new BinaryTreeNodeWithNext <int> { Data = 2 }; var C = new BinaryTreeNodeWithNext <int> { Data = 3 }; var D = new BinaryTreeNodeWithNext <int> { Data = 4 }; var E = new BinaryTreeNodeWithNext <int> { Data = 5 }; var F = new BinaryTreeNodeWithNext <int> { Data = 6 }; var G = new BinaryTreeNodeWithNext <int> { Data = 7 }; var H = new BinaryTreeNodeWithNext <int> { Data = 8 }; var I = new BinaryTreeNodeWithNext <int> { Data = 9 }; var J = new BinaryTreeNodeWithNext <int> { Data = 10 }; var K = new BinaryTreeNodeWithNext <int> { Data = 11 }; var L = new BinaryTreeNodeWithNext <int> { Data = 12 }; var M = new BinaryTreeNodeWithNext <int> { Data = 13 }; var N = new BinaryTreeNodeWithNext <int> { Data = 14 }; var O = new BinaryTreeNodeWithNext <int> { Data = 15 }; A.Left = B; B.Left = C; C.Left = D; C.Right = E; B.Right = F; F.Left = G; F.Right = H; A.Right = I; I.Left = J; J.Left = K; J.Right = L; I.Right = M; M.Left = N; M.Right = O; Solution.ConstructRightSibling(A); A.Next.Should().BeNull(); B.Next.Should().BeEquivalentTo(I); C.Next.Should().BeEquivalentTo(F); D.Next.Should().BeEquivalentTo(E); E.Next.Should().BeEquivalentTo(G); F.Next.Should().BeEquivalentTo(J); G.Next.Should().BeEquivalentTo(H); H.Next.Should().BeEquivalentTo(K); I.Next.Should().BeNull(); J.Next.Should().BeEquivalentTo(M); K.Next.Should().BeEquivalentTo(L); L.Next.Should().BeEquivalentTo(N); M.Next.Should().BeNull(); N.Next.Should().BeEquivalentTo(O); O.Next.Should().BeNull(); }