데이터 구조 - 이진 트리 탐색

순회 개념

이진 트리 노드의 검색 경로를 따라 투어는 이러한 각각의 노드는 한 번 방문하고 있으며, 한 번만 액세스됩니다.

정보 출력 노드 등 : "액세스"란 같은 매우 광범위 할 수있다.

(각 노드는 모두 하나의 후속을 갖기 때문에) "이송"선형 구조 연산의 모든 유형, 단지 검색 경로는, 추가적인 설명을 필요로하지 않는다. 이진 비선형 구조의 각 노드는 두 후임을 가지고, 즉, 통과하는 문제가 무엇인지에 따라 상기 탐색 경로를 탐색하는 방법.

검색 경로

은 "이진 트리"는 우려를 들어, 세 개의 검색 경로가있을 수 있습니다 :

  1. 처음에 계층 구조를 탐색 한 후,
  2. 오른쪽에 (하위 트리) 탐색 뒤 (하위 트리)를 왼쪽으로
  3. 첫 번째 (서브 트리) 순회 후방 우측 (서브 트리) 떠났다.

순회 알고리즘 (비 재귀)

예약 주문

이진 트리가 비어있는 경우, 공기 작동, 그렇지 않으면,

  1. 액세스 루트 노드;
  2. 왼쪽 서브 트리를 선주문;
  3. 바로 하위 트리 선주문.

예약 주문

이진 트리가 비어있는 경우, 공기 작동, 그렇지 않으면,

  1. 왼쪽 서브 트리를 선주문;
  2. 액세스 루트 노드;
  3. 바로 하위 트리 선주문.

Postorder

이진 트리가 비어있는 경우, 공기 작동, 그렇지 않으면,

  1. 왼쪽 서브 트리의 순서를 통과 한 후,
  2. 바로 서브 트리를 Postorder.
  3. 액세스 루트 노드;

예약 주문 탐색 코드 설명

void preOrder(BiTree T, void(*visit)(int &e){
    //先序遍历二叉树
    if(T){
        visit(T->data); //访问节点
        preOrder(T->lchild, visit); //遍历左子树
        preOrder(T->richild, visit);    //遍历右子树
    }
}

순회 알고리즘 (재귀)

예약 주문

스택 포인터 스토리지 노드를 사용하여 중앙 전순 알려진 프로세스가 반환해야 할 첫 번째 스캔 (액세스 할 수 없습니다) 왼쪽 모든 노드의 루트 노드와 스택에 그들 모두.

그런 다음 액세스가 더 왼쪽 자식 노드 왼쪽 자식 노드가 없거나 노드가 방문했던 것을 그것은 분명하다, 노드를 팝업.

그런 다음 스택입니다 우측 자식 노드의 접합을 검색하고 스택이 비어 때까지, 왼쪽과 오른쪽 자식 노드 스택에 (11), 이러한 방식의 모든 노드를 검사합니다.

void inOrder(BtTree root){
    initStack(&S);  //初始化栈
    p = root;
    while(p != NULL || !StackEmprt(S)){
        if(p != NULL){
            //根指针进栈,遍历左子树
            Push(&S, p);
            p = p->lchild;
        } else {
            //根指针出栈,访问根节点,遍历右子树
            Pop(%S, p);
            Visit(p->data); //访问节点
            p = p->rchild;
        }
    }
}

예약 주문

선주문 과정에서, 먼저, 루트를 방문 왼쪽 하위 트리 오른쪽 하위 트리의 마지막 방문을 방문하십시오.

따라서, 스택에 첫 번째 루트 노드는, 스택이 비어주기는되지 않습니다 : 스택 p, 액세스 *p한 후 노드, 스택에 오른쪽 자식 노드, 그리고 스택에 자식 노드를 떠났다.

void preOrder(BtTree root){
    initStack(&S);
    p = root;
    if(root != NULL){
        Push(&S,p); //根节点进栈
        while(!StackEmpty(S)){  //栈不空时循环
            Pop(&S, p); //出栈并访问该节点
            Visit(p->data);
            if(p->rchild != NULL){
                Push(&S,p)->rchild);    //右孩子进栈
            } else if(p->lchild != NULL){   //左孩子进栈
                Push(&S, lchild);
            }
        }
    }
}

그리고 모티브 시퀀스 전순 기여 이진 트리

여기에 그림 삽입 설명

추천

출처blog.csdn.net/hjc256/article/details/94292506