C#二叉树 - Inorder / Preorder和PostOrder(递归帮助)

时间:2012-01-16 00:13:38

标签: c# recursion binary-tree

我需要一些递归帮助。我正在尝试用C#做一个二叉树,我想知道是否有可能用递归函数演示所有Inorder / PostOrder和PreOrder遍历。

我已经为PreOrder完成了它,然后尝试了InOrder然而导致了StackOverflow异常,我对二叉树的掌握最多是脆弱的,所以任何帮助都会非常感激,即使它看起来像是一个愚蠢的问题。

以下代码是我用于PreOrder Traversal的内容;

     public void recursivePreorder(BinaryTreeNode root)
    {
        Console.Write(root.Data.ToString());
        if (root.Left != null)
        {
            recursivePreorder(root.Left);
        }
        if (root.Right != null)
        {
            recursivePreorder(root.Right);
            }
    }

     public void preorderTraversal()
    {
        if (Root != null)
        {
            recursivePreorder(Root);
        }
        else
        {
            Console.WriteLine("There is no tree to process");
        }

    static void Main(string[] args)
    {

        // Build the tree
        Test.Add(5);
        Test.Add(2);
        Test.Add(1);
        Test.Add(3);
        Test.Add(3); // Duplicates are OK
        Test.Add(4);
        Test.Add(6);
        Test.Add(10);
        Test.Add(7);
        Test.Add(8);
        Test.Add(9);
        // Test if we can find values in the tree

        for (int Lp = 1; Lp <= 10; Lp++)
            Console.WriteLine("Find Student ID ({0}) = {1}", Lp, Test.Find(Lp));

        // Test if we can find a non-existing value
        Console.WriteLine("Find Student ID (999) = {0}", Test.Find(999));

        // Iterate over all members in the tree -- values are returned in sorted order
        foreach (int value in Test)
        {
            Console.WriteLine("Value: {0}", value);
        }

        Console.WriteLine("Preorder Traversal");
        Console.WriteLine("");
        Test.preorderTraversal();
        Console.WriteLine("");
    }

在此先感谢,这绝对是我无法理解的问题,我甚至不确定是否可能。

3 个答案:

答案 0 :(得分:4)

Inorder与您已有的非常相似,只需稍微移动您处理当前节点的代码:

public void recursiveInorder(BinaryTreeNode root)
{
    if (root.Left != null)
    {
        recursiveInorder(root.Left);
    }
    Console.Write(root.Data.ToString());
    if (root.Right != null)
    {
        recursiveInorder(root.Right);
    }
}

预先排序的不同之处仅在于您首先遍历左子树,然后处理当前节点并最终遍历右子树。

答案 1 :(得分:2)

tree traversal州的维基页面:

  

二叉树

     

要遍历预订中的非空二进制树,请在每个节点处递归执行以下操作,   与根节点:

     
      
  1. 访问root。
  2.   
  3. 遍历左子树。
  4.   
  5. 遍历正确的子树。
  6.         

    要遍历 inorder (对称)中的非空二进制树,请执行   在每个节点递归执行以下操作:

         
        
    1. 遍历左子树。
    2.   
    3. 访问root。
    4.   
    5. 遍历正确的子树。
    6.         

      要遍历后序中的非空二进制树,请执行   在每个节点递归执行以下操作:

           
          
      1. 遍历左子树。
      2.   
      3. 遍历正确的子树。
      4.   
      5. 访问root。
      6.   

[顺便说一下,这是第一次搜索。]

答案 2 :(得分:-1)

  class BstNode
    {
        public int data;
        public BstNode(int data)
        {
            this.data = data;
        }
        public BstNode left;
        public BstNode right;
    }
class Program
            {
                public static void PreOrderTraversal(BstNode root)
                {
                    if (root == null) return;

                    Console.WriteLine("PreOrderTraversal at node {0}", root.data); // process the root
                    PreOrderTraversal(root.left);// process the left
                    PreOrderTraversal(root.right);// process the right
                }

                public static void InOrderTraversal(BstNode root)
                {
                    if (root == null) return;

                    InOrderTraversal(root.left);// process the left
                    Console.WriteLine("InOrderTraversal at node {0}", root.data); // process the root
                    InOrderTraversal(root.right);// process the right
                }

                public static void PostOrderTraversal(BstNode root)
                {
                    if (root == null) return;

                    PostOrderTraversal(root.left);// process the left            
                    PostOrderTraversal(root.right);// process the right
                    Console.WriteLine("PostOrderTraversal at node {0}", root.data); // process the root
                }
        }