public static BinaryTreeNodeWithSize <int> FindKthNodeBinaryTree(BinaryTreeNodeWithSize <int> tree, int k) { var iter = tree; while (iter != null) { var leftSize = iter.Left?.Size ?? 0; if (leftSize + 1 < k) // k-th node must be in right subtree of iter. { k -= leftSize + 1; iter = iter.Right; } else if (leftSize == k - 1) // k-th is iter itself. { return(iter); } else // k-th node must be in left subtree of iter. { iter = iter.Left; } } // If k is between 1 and the tree size, this line is unreachable . return(null); }
public void FindKthNodeBinaryTree() { var A = new BinaryTreeNodeWithSize <int>() { Data = 314 }; var B = new BinaryTreeNodeWithSize <int>() { Data = 6 }; var C = new BinaryTreeNodeWithSize <int>() { Data = 271 }; var D = new BinaryTreeNodeWithSize <int>() { Data = 28 }; var E = new BinaryTreeNodeWithSize <int>() { Data = 0 }; var F = new BinaryTreeNodeWithSize <int>() { Data = 561 }; var G = new BinaryTreeNodeWithSize <int>() { Data = 3 }; var H = new BinaryTreeNodeWithSize <int>() { Data = 17 }; var I = new BinaryTreeNodeWithSize <int>() { Data = 6 }; var J = new BinaryTreeNodeWithSize <int>() { Data = 2 }; var K = new BinaryTreeNodeWithSize <int>() { Data = 1 }; var L = new BinaryTreeNodeWithSize <int>() { Data = 401 }; var M = new BinaryTreeNodeWithSize <int>() { Data = 641 }; var N = new BinaryTreeNodeWithSize <int>() { Data = 257 }; var O = new BinaryTreeNodeWithSize <int>() { Data = 271 }; var P = new BinaryTreeNodeWithSize <int>() { Data = 28 }; A.Left = B; A.Right = I; B.Left = C; B.Right = F; C.Left = D; C.Right = E; F.Right = G; G.Left = H; I.Left = J; I.Right = O; J.Right = K; K.Left = L; K.Right = N; L.Right = M; O.Right = P; var result = Solution.FindKthNodeBinaryTree(A, 10); result.Should().BeEquivalentTo(L); }