我为BST编写了3种方法:
它们都是递归方法,我必须在方法内打印值,但我想要的是返回值并将其打印在这些方法之外。
我为InOrder编写了一个GetEnumerator(),但问题是我需要所有的树方法
一种方法是向数组添加值并返回数组,但这对性能不利,因为我们在代码中添加了一个数组。
编辑:如何为所有我的hree方法设置GetEnumerator?
public void PreOrder(BinaryTreeNode<T> node)
{
if (node != null)
{
MessageBox.Show(node.Value.ToString());
PreOrder(node.Left);
PreOrder(node.Right);
}
}
public void PostOrder(BinaryTreeNode<T> node)
{
if (node != null)
{
PostOrder(node.Left);
PostOrder(node.Right);
MessageBox.Show(node.Value.ToString());
}
}
public void InOrder(BinaryTreeNode<T> node)
{
if (node != null)
{
InOrder(node.Left);
MessageBox.Show(node.Value.ToString());
InOrder(node.Right);
}
}
BinaryTreeNode类中的GetEnumerator。
public IEnumerator<T> GetEnumerator()
{
if (Left != null)
{
foreach (var v in Left)
{
yield return v;
}
}
yield return Value;
if (Right != null)
{
foreach (var v in Right)
{
yield return v;
}
}
}
答案 0 :(得分:2)
我会这样实现它:
public class BinaryTree<T>{
BinaryTreeNode<T> root;
#Your code....
public IEnumerable<BinaryTreeNode<T>> PreOrder(){
return DoPreorder(root);
}
public IEnumerable<BinaryTreeNode<T>> PostOrder(){
return DoPostOrder(root);
}
public IEnumerable<BinaryTreeNode<T>> InOrder(){
return DoInOrder(root);
}
private IEnumerable<BinaryTreeNode<T>> DoPreorder(BinaryTreeNode<T> node){
if(node != null){
yield return node;
}
else{
yield break;
}
foreach(var leftNode in DoPreorder(node.Left)){
yield return leftNode;
}
foreach(var rightNode in DoPreorder(node.Right)){
yield return rightNode;
}
}
private IEnumerable<BinaryTreeNode<T>> DoPostOrder(BinaryTreeNode<T> node){
if(node == null){
yield break;
}
if(node.Left != null){
foreach(var leftNode in DoPostOrder(node.Left)){
yield return leftNode;
}
}
if(node.Right != null){
foreach(var rightNode in DoPostOrder(node.Right)){
yield return rightNode;
}
}
yield return node;
}
private IEnumerable<BinaryTreeNode<T>> DoInOrder(BinaryTreeNode<T> node){
if(node == null){
yield break;
}
if(node.Left != null){
foreach(var leftNode in DoInOrder(node.Left)){
yield return leftNode;
}
}
yield return node;
if(node.Right != null){
foreach(var rightNode in DoInOrder(node.Right)){
yield return rightNode;
}
}
}
}
现在,如果您需要在PreOrder中打印节点的值,您只需要这样做:
var tree = GetYourTree();
foreach(var node in tree.PreOrder()){
Console.WriteLine(node.Value);
}
另一种方法是实施预购; PostOder和InOrder作为属性。
作为实现GetEnumerator的一种方法,我建议你返回一个Dictionary&gt;&gt;包含像“preorder”,“postorder”和“inorder”这样的字符串作为键和IEnumerable&gt;作为您可以调用以前实现的方法的值。
希望它有所帮助,