internal ThreadedBinaryTreeNode <T> BuildThreadedTree(BinaryTreeNodeBase <T> root, ThreadedBinaryTreeNode <T> nodeParent, ThreadedBinaryTreeNode <T> nodeRecentVisited) { if (root == null) { return(null); } bool isLeftThreaded = (root.Left == null); bool isRightThreaded = (root.Right == null); ThreadedBinaryTreeNode <T> node = new ThreadedBinaryTreeNode <T>(root.Value, isLeftThreaded, null, isRightThreaded, null); ThreadedBinaryTreeNode <T> left = BuildThreadedTree(root.Left, node, nodeRecentVisited); ThreadedBinaryTreeNode <T> right = BuildThreadedTree(root.Right, nodeParent, node); if (isLeftThreaded) { left = nodeRecentVisited; } if (isRightThreaded) { right = nodeParent; } node.AddChild(left); node.AddChild(right); return(node); }