2012-01-16 2 views
3

재귀에 도움이 필요합니다. 나는 C#에서 이진 트리를 만들려고하는데, 모든 Inorder/PostOrder와 PreOrder traversal을 재귀 함수로 보여줄 수 있는지 궁금하다.C# 이진 트리 - Inorder/Preorder 및 PostOrder (재귀 도움말)

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(""); 
    } 

미리 감사드립니다, 이것은 확실히 내가 주위에 내 머리를 얻는 데 문제가 무엇인가하고 나는 그것이 가능하다면 모르겠어요.

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

예약 주문에 차이가 먼저 왼쪽을 통과하는 것이 그냥 :

답변

3

중위 당신이 이미 가지고있는 것과 매우 유사하다, 어디서 현재 노드를 처리하는에 약간의 주위에 당신의 코드를 이동 그런 다음 현재 노드를 처리하고 마지막으로 오른쪽 하위 트리를 탐색합니다.

tree traversal 상태의 위키 페이지
+0

빠른 답변을 주셔서 대단히 감사합니다. 혹시 PostOrder도 보여줄 수 있습니까? 그리고 그게 실제로 어떻게 효과가 있는지 설명해 주실 수 있습니까? 저는 바이너리 트리의 작동 방식과 재귀가 작동하는 방식에 막 달라 붙었습니다. 비록 당신의 대답이 완벽하게 명확하기는하지만이 주제를 둘러싼 모든 것을 이해하는 데 어려움을 겪고있는 것 같습니다. –

+0

@SteffanCaine : 잠시 생각해보십시오 : * post * 명령은 현재 노드의 처리를 마지막으로 이동시킵니다. 그래서'Console.Write' 문을 어디에 놓을까요? @Mitch가 링크 된 wikipedia 기사도 확인하십시오. – BrokenGlass

+0

하, 나는 그것이 간단하고 아래 기사 링크와 귀하의 회신과 함께 그것은 매우 분명하다는 것을 알았습니다. 고마워요.) –

2

:

이진 트리

예약 주문에서 비어 있지 않은 이진 트리를 탐색하려면, 각 노드에 재귀 적으로 다음과 같은 작업을 수행하여 시작 루트 노드 :

  1. 루트를 방문하십시오.
  2. 왼쪽 하위 트리를 탐색합니다.
  3. 오른쪽 하위 트리를 탐색하십시오.

재귀 각 노드에서 다음과 같은 작업을 수행, (대칭) 중위 에서 비어 있지 않은 이진 트리를 탐색하려면

  1. 을 왼쪽 하위 트리 트래버스.
  2. 루트를 방문하십시오.
  3. 오른쪽 하위 트리를 탐색하십시오.

    1. 을 왼쪽 하위 트리 트래버스 :

  4. 재귀 각 노드에서 다음과 같은 작업을 수행, postorder에서 비어 있지 않은 이진 트리를 탐색합니다.
  5. 오른쪽 하위 트리를 탐색하십시오.
  6. 루트를 방문하십시오.

[BTW, 최초의 검색 히트였습니다.]

+0

나는 실제로 이것을 설명하려고하는 문서를 이미 얻었다. 나는 그것을 얻지 못했다. 그래서 더 인간적인 대답을 원했지만, 링크 된 게시물은 매우 도움이된다. –