트리(2)

C/C자료구조 : 2007. 11. 9. 09:56

1) 전위 순회 - 루트 > 왼쪽 서브트리 > 오른쪽 서브트리를 차례로 방문.

                      - 1. 노드가 NULL이면 더이상 순환 호출을 하지 않는다.

                      - 2. 노드의 데이터를 출력한다.

                      - 3. 노드의 왼쪽 서브트리를 순환 호출하여 방문한다.

                      - 4. 노드의 오른쪽 서브트리를 순환 호출하여 방문한다.


preorder(TreeNode *root) {
 if(root) {
  printf("%d ", root->data);
  preorder(root->left);
  preorder(root->right);
 }
}



2) 중위 순회 - 왼쪽 서브트리 > 루트 > 오른쪽 서브트리


inorder(TreeNode *root) {
 if(root) {
  inorder(root->left);
  printf("%d ", root->data);
  inorder(root->right);
 }
}


3) 후위 순회 - 왼쪽 서브트리의 모든 노드 > 오른쪽 서브트리의 모든 노드 > 루트노드


postorder(TreeNode *root) {
 if(root) {
  postorder(root->left);
  postorder(root->right);
  printf("%d ", root->data);
 }
}


*링크법으로 생성된 이진트리 - 순회


#include <stdio.h>
#include <stdlib.h>
#include <memory.h>


typedef struct TreeNode {
 int data;
 struct TreeNode *left, *right;
} TreeNode;


TreeNode n1 = { 1, NULL, NULL };        //노드의 정적 생성(malloc를 사용하지 않는것)
TreeNode n2 = { 4, &n1, NULL };         //노드를 간편하게 만들수 있으나 노드개수가 한정되어 있다.
TreeNode n3 = { 16, NULL, NULL };      //실제로는 잘 사용되지 않는다고 한다.
TreeNode n4 = { 25, NULL, NULL };
TreeNode n5 = { 20, &n3, &n4 };
TreeNode n6 = { 15, &n2, &n5 };
TreeNode *root = &n6;


inorder(TreeNode *root)             //전위순회

{
 if(root) {
  inorder(root->left);
  printf("%d ", root->data);
  inorder(root->right);
 }
}


preorder(TreeNode *root)          //중위순회

{
 if(root) {
  printf("%d ", root->data);
  preorder(root->left);
  preorder(root->right);
 }
}


postorder(TreeNode *root)           //후위순회

{
 if(root) {
  postorder(root->left);
  postorder(root->right);
  printf("%d ", root->data);
 }
}


void main()
{
 inorder(root);
 printf("\n");
 preorder(root);
 printf("\n");
 postorder(root);
 printf("\n");
}


4) 레벨순회

- 각 노드를 레벨 순으로 검사한다.

- 동일한 레벨일 때는 좌->우로 방문한다.

- 큐를 사용하는 순회법이다.


*트리 레벨 순회 알고리즘


level_order(root)

{

  initialize queue;                                             //큐 초기화

    enqueue(queue, root);                              //루트 노드를 큐에 삽입

    while is_empty(queue) != TRUE do          //큐가 공백이 될때까지 계속 다음을 반복한다.

      x <- dequeue(queue);                             //큐 맨처음에 있는 노드 x를 꺼내온다.

      if(x != NULL)                                                //x가 NULL이 아니면

        then print  x->data;                                 //x의 데이터값을 출력하고

                 enqueue(queue, x->left);             //x의 왼쪽 자식을 큐에 삽입

                 enqueue(queue, x->right);           //x의 오른쪽 자식을 큐에 삽입

}


Posted by 청웨일