데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명

Binary Tree Traversal (날 찔러주세요) 기사에서는 이진 검색 트리의 순회를 주로 소개하고 있으며,이 기사에서는 계속해서 이진 검색 트리의 검색을 소개합니다.

두 번째 검색 포크 트리의 검색은 주로 지정된 요소 노드, 최대 및 최소 검색, 지정된 노드의 선행 또는 후속 노드 검색을 포함합니다. 아래에 별도로 소개됩니다.

지정된 요소 찾기

이진 검색 포크 트리에서 주어진 값 키를 검색하는 프로세스는 이진 검색과 매우 유사합니다. 프로세스는 다음과 같습니다. 먼저 키워드 키를 트리 루트의 키와 비교합니다. 키가 루트의 키보다 크면 루트의 키는 다음과 같습니다. 오른쪽 하위 트리에서 검색하고 그렇지 않으면 루트의 왼쪽 하위 트리에서 검색합니다. 빈 노드를 찾거나 만날 때까지이 프로세스를 반복합니다. 다음 그림은 두 노드의 키를 찾는 프로세스를 보여줍니다.
데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명

검색 프로세스에 따라 재귀 및 비 재귀 코드 구현은 다음과 같습니다.

//查找值为key的节点,递归版本
Node* bstree_search(BSTree root, Type key)
{
    if (root==NULL || root->key==key)
        return root;

    if (key < root->key)
        return bstree_search(root->left, key);
    else
        return bstree_search(root->right, key);
}
//查找值为key的节点,非递归版本
Node* iterative_bstree_search(BSTree root, Type key)
{
    while ((root!=NULL) && (root->key!=key))
    {
        if (key < root->key)
            root = root->left;
        else
            root = root->right;
    }

    return root;
}

최대 값과 최소값 찾기

이진 검색 트리의 특성에 따라 생각하기 쉽습니다. 비어 있지 않은 이진 검색 트리는 최대 값을 찾습니다. 프로세스는 간단합니다. 루트 노드에서 오른쪽 하위 트리 노드로 재귀 적으로 이동하기 만하면됩니다. 순회 된 노드의 오른쪽 자식이 NULL이면 다음 그림과 같이이 노드가 트리의 최대 값입니다.

같은 방식으로 최소값을 찾는 프로세스도 비슷합니다. 루트 노드에서 왼쪽 하위 트리 노드로 재귀 적으로 이동합니다. 순회 된 노드의 왼쪽 자식이 NULL이면이 노드가 트리의 최소값입니다.
데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명

최대 값을 찾기위한 코드 구현은 다음과 같습니다. 최소값은 비슷합니다. 최소값은 직접 찾아 볼 수 있습니다.

//查找最大值
Node* bstree_maximum(BSTree root)
{
    if (root == NULL)
        return NULL;

    while(root->right != NULL)
        root = root->right;
    return root;
}

선행 및 후속 노드 찾기

여기에 언급 된 노드의 선행 노드와 후속 노드는 순회 순회 시퀀스에서 특정 노드의 선행 노드와 후속 노드를 나타냅니다. 자세히 : 이진 검색 트리의 경우 특정 노드 x의 선행 노드가 키보다 작습니다. [x]의 모든 키워드 중 가장 큰 노드, 후속 노드는 key [x]의 모든 키워드 중 가장 작은 노드입니다.

전구체 단계 찾기 :

(1) 먼저 노드 x에 왼쪽 하위 트리가 있는지 판단합니다. 왼쪽 하위 트리가 있으면 왼쪽 하위 트리의 가장 큰 노드가 x의 선행 노드입니다.
(2) 왼쪽 하위 트리가 없지만 노드가 상위 노드의 오른쪽 인 경우 자식이면 부모 노드는 노드의 선행 노드입니다.
(3) 왼쪽 자식 트리가 없지만 노드가 부모 노드의 왼쪽 자식 인 경우 하나를 찾을 때까지 부모 노드를 따라 트리의 맨 위를 찾아야합니다. 노드 P, P 노드는 부모 노드 Q의 오른쪽 자식이고 Q는이 노드의 선행 노드입니다.

데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명
데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명
후속 노드를 찾는 단계 :
(1) 먼저 노드 x에 올바른 하위 트리가 있는지 판단하고, 오른쪽 하위 트리가 있으면 오른쪽 하위 트리의 가장 작은 노드가 x의 선행 노드입니다.
(2) 올바른 하위 트리가 없지만이 노드 부모 노드의 왼쪽 자식이고 부모 노드는 노드의 후속 노드입니다.
(3) 오른쪽 자식 트리가 없지만 노드가 부모 노드의 오른쪽 자식이면 부모 노드를 트리까지 계속 따라야합니다. 상위 노드 Q의 왼쪽 자식 인 노드 P를 찾을 때까지 맨 위를보고 Q는이 노드의 후속 노드입니다.

세 번째 경우 텍스트는 약간 추상적 일 수 있습니다. 그림을 사용하여 설명해 보겠습니다. 예를 들어 다음 그림은 노드 13의 후속 노드 15의 프로세스를 찾습니다.
데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명

선행 노드 검색의 코드 구현은 다음과 같습니다. 후행 노드는 유사합니다. 후속 노드 검색 코드를 직접 구현할 수 있습니다.

//查找节点x的前驱节点Node* bstree_predecessor(Node *x)
{
    /* 如果x存在左孩子,则"x的前驱结点"为     
    "以其左孩子为根的子树的最大结点"。*/
    if (x->left != NULL)
        return bstree_maximum(x->left);

    // 如果x没有左孩子。则x有以下两种可能:
    // (01) x是"一个右孩子",则"x的前驱结点"为 "它的父结点"。
    /* (02) x是"一个左孩子",则查找"x的最低的父结点,            
            并且该父结点要具有右孩子",找到的这个"最低的父结点"            
            就是"x的前驱结点"。*/
    Node* y = x->parent;
    while ((y!=NULL) && (x==y->left))
    {
        x = y;
        y = y->parent;
    }

    return y;
}

추천 자료 :

[복지] 직접 수집 한 온라인 부티크 코스 영상 공유 ( Part 1 )
[시스템 설계] LRU 캐시
[데이터 구조 및 알고리즘] 이해하기 쉬운 이진 검색 트리
[데이터 구조 및 알고리즘] 이해하기 쉬운 링크드리스트
[데이터 구조 및 알고리즘 ] 비트 정렬에 대한 이해하기 쉬운 설명
[C ++ Notes] C ++ 11 동시 프로그래밍 (1) 스레드 여정 시작
[C ++ Notes] C / C ++ 포인터 사용시 일반적인 함정

서버 배경 기술 스택 지식 요약 공유에 집중

의사 소통 및 공동 진행에 관심을 기울이는 것을 환영합니다.

데이터 구조 및 알고리즘] 이진 검색 트리 검색에 대한 이해하기 쉬운 설명

코딩

코드 농부는 이해하기 쉬운 기술 문서를 제공하여 기술을 더 쉽게 만들 수있는 올바른 방법을 가지고 있습니다!

추천

출처blog.51cto.com/15006953/2552023