[リソース構造]ナビゲーション(Search)1-バイナリナビゲーションツリー(11-2-2)ナビゲーション


さあ.次にナビゲーションを担当するBSTSsearch関数を見てみましょう!
探索の過程は挿入の過程を根拠にしています!
BTreeNode *BSTSearch(BTreeNode * bst, BSTData target)
{
    BTreeNode * cNode = bst; // current Node
    BSTData cd; // current Data
    
    while(cNode != NULL)
    {
        cd = GetData(cNode);
        
        if(target == cd)
            return cNode;
        else if(target<cd)
            cNode = GetLeftSubTree(cNode);
        else
            cNode = GetRightSubTree(cNode);
    }
    return NULL;
}
一方、ドアでは、値が比較オブジェクトのノードより小さい場合は、左/右に移動します.
このように繰り返し文の中で移動を続け、target=cdのとき、cNodeに戻って終了します!
ただし、移動可能なサブノードがない場合は、検索するデータは存在しません!
これに基づいてwhileゲートの脱出条件を構成した.
ここまでの内容でmain関数を構築しましょう.
まず
みんなにBST.cを見せます
//
//  BinarySearchTree.c
//  BinarySearchTree
//
//  Created by 서희찬 on 2021/04/17.
//
#include <stdio.h>
#include "BinaryTree2.h"
#include "BinarySearchTree.h"

void BSTMakeAndInit(BTreeNode ** pRoot)
{
   *pRoot = NULL;
}

BSTData BSTGetNodeData(BTreeNode * bst)
{
   return GetData(bst);
}

void BSTInsert(BTreeNode ** pRoot, BSTData data)
{
   BTreeNode * pNode = NULL; //parent Node
   BTreeNode * cNode = *pRoot; // Current Node
   BTreeNode * nNode = NULL; // New Node
   
   // 새노드 저장될 위치 찾는다.
   while(cNode != NULL)
   {
       if(data == GetData(cNode))
           return; // 데이터 중복 허용 x
       
       pNode = cNode; // 매번 while 문을 돌때마다 초기화가 된다.
       
       if(GetData(cNode)>data)
       {
           cNode = GetLeftSubTree(cNode);
       }
       else
           cNode = GetRightSubTree(cNode);
   
   }
   
   //pNode의 자식 노드로 추가할 새 노드의 생성
   nNode = MakeBTreeNode(); // 새 노드 생성
   SetData(nNode, data);
   
   // pNode 의 자식 노드로 추가할 새 노드의 생성
   if(pNode != NULL) // 새  노드가 루트노드아니라면
   {
       if(data < GetData(pNode))
           MakeLeftSubTree(pNode, nNode);
       else
           MakeRightSubTree(pNode, nNode);
   }
   else{ //새노드가 루트노라면
       *pRoot = nNode;
   }
   

}

BTreeNode *BSTSearch(BTreeNode * bst, BSTData target)
{
   BTreeNode * cNode = bst; // current Node
   BSTData cd; // current Data
   
   while(cNode != NULL)
   {
       cd = GetData(cNode);
       
       if(target == cd)
           return cNode;
       else if(target<cd)
           cNode = GetLeftSubTree(cNode);
       else
           cNode = GetRightSubTree(cNode);
   }
   return NULL;
}
これに基づいて、BSTMain.みんなにcを見せます
#include <stdio.h>
#include "BinarySearchTree.h"

int main(void)
{
    BTreeNode * bstRoot;
    BTreeNode * sNode; // search Node
    
    BSTMakeAndInit(&bstRoot);
    
    BSTInsert(&bstRoot, 9);
    BSTInsert(&bstRoot, 1);
    BSTInsert(&bstRoot, 6);
    BSTInsert(&bstRoot, 2);
    BSTInsert(&bstRoot, 8);
    BSTInsert(&bstRoot, 3);
    BSTInsert(&bstRoot, 5);
    
    sNode = BSTSearch(bstRoot, 1);
    if(sNode == NULL)
        printf("탐색 실패 ! \n");
    else
        printf("탐색에 성공한 키의 값 : %d \n", BSTGetNodeData(sNode));

    sNode = BSTSearch(bstRoot, 4);
    if(sNode == NULL)
        printf("탐색 실패 ! \n");
    else
        printf("탐색에 성공한 키의 값 : %d \n", BSTGetNodeData(sNode));
    
    sNode = BSTSearch(bstRoot, 6);
    if(sNode == NULL)
        printf("탐색 실패 ! \n");
    else
        printf("탐색에 성공한 키의 값 : %d \n", BSTGetNodeData(sNode));
    
    sNode = BSTSearch(bstRoot, 7);
    if(sNode == NULL)
        printf("탐색 실패 ! \n");
    else
        printf("탐색에 성공한 키의 값 : %d \n", BSTGetNodeData(sNode));
    
    return 0;
}

成功しました.ツリーにキー値がある場合は、出力します.
上のmain関数で、値をバイナリプローブツリーに保存し、保存するレベルを確認して終了します.
次の文書では、
ツリーの「ループ」を使用して、ツリーに格納されている値を全面的にチェックします.