C# 二叉树GetEnumerator()方法实现非递归中序遍历

using System;

using System.Collections.Generic;

using System.Collections;

namespace MyPractise.TreePractise

{

/// <summary>

/// Abstract node

/// </summary>

/// <typeparam name="T">Node instance</typeparam>

abstract class TreeNode<T> where T : TreeNode<T>

{

public T LeftNode { get; set; }

public T RightNode { get; set; }

}

/// <summary>

/// Tree class

/// </summary>

/// <typeparam name="T">Node instance</typeparam>

class Tree<T> where T : TreeNode<T>

{

/// <summary>

/// Root node

/// </summary>

public T RootNode { get; set; }

public IEnumerator GetEnumerator()

{

//Reserve nodes which have right node.

Stack<T> stack = new Stack<T>();

//Current node instance

T currentNode = RootNode;

//When current node was set as the last node's right node, exit the cycle

while(currentNode!=null)

{

//When current still has left node, add current node to stack and set current node as the his left node, do the cycle again

while (currentNode.LeftNode != null)

{

stack.Push(currentNode);

currentNode = currentNode.LeftNode;

}

//Add current node to stack

stack.Push(currentNode);

//Set current node as the output of the stack, output the node

do

{

if (stack.Count != 0)

{

currentNode = (T)stack.Pop();

yield return currentNode;

}

else

{

break;

}

}

//Do this cycle, until right node of current node was not empty

while (currentNode.RightNode == null);

//Set current node as the right node and go on the big cycle

currentNode = currentNode.RightNode;

}

}

}

}

你可能感兴趣的:(enum)