前序、后序、中序遍历如何写GetEnumerator?
How to write a GetEnumerator for Pre-order, Postorder, In-order traversal?
我已经为我的 BST 编写了 3 个方法:
- 预购();
- PostOrder();
- 有序();
它们都是递归方法,我必须在方法内部打印值,但我想要的是 return 值并在这些方法外部打印它。
我已经为 InOrder 写了一个 GetEnumerator(),但问题是我需要所有的树方法。
一种方法是将值添加到数组和 return 数组,但这对性能不利,因为我们在代码中添加了一个数组。
编辑:如何为我的所有 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 class。
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;
}
}
}
我会这样实现:
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 的一种方法,我建议您 return 一个字典>> 包含像 "preorder"、"postorder" 和 "inorder" 这样的字符串作为键和 IEnumerable > 作为值,您可以调用之前实现的方法。
希望对您有所帮助,
我已经为我的 BST 编写了 3 个方法:
- 预购();
- PostOrder();
- 有序();
它们都是递归方法,我必须在方法内部打印值,但我想要的是 return 值并在这些方法外部打印它。
我已经为 InOrder 写了一个 GetEnumerator(),但问题是我需要所有的树方法。
一种方法是将值添加到数组和 return 数组,但这对性能不利,因为我们在代码中添加了一个数组。
编辑:如何为我的所有 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 class。
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;
}
}
}
我会这样实现:
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 的一种方法,我建议您 return 一个字典>> 包含像 "preorder"、"postorder" 和 "inorder" 这样的字符串作为键和 IEnumerable > 作为值,您可以调用之前实现的方法。
希望对您有所帮助,