[リソース構造]ナビゲーション(Search)1-バイナリナビゲーションツリー(11-2-2)ナビゲーション
さあ.次にナビゲーションを担当するBSTSsearch関数を見てみましょう!
探索の過程は挿入の過程を根拠にしています!
このように繰り返し文の中で移動を続け、target=cdのとき、cNodeに戻って終了します!
ただし、移動可能なサブノードがない場合は、検索するデータは存在しません!
これに基づいてwhileゲートの脱出条件を構成した.
ここまでの内容でmain関数を構築しましょう.
まず
みんなにBST.cを見せます
成功しました.ツリーにキー値がある場合は、出力します.
上のmain関数で、値をバイナリプローブツリーに保存し、保存するレベルを確認して終了します.
次の文書では、
ツリーの「ループ」を使用して、ツリーに格納されている値を全面的にチェックします.
探索の過程は挿入の過程を根拠にしています!
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関数で、値をバイナリプローブツリーに保存し、保存するレベルを確認して終了します.
次の文書では、
ツリーの「ループ」を使用して、ツリーに格納されている値を全面的にチェックします.
Reference
この問題について([リソース構造]ナビゲーション(Search)1-バイナリナビゲーションツリー(11-2-2)ナビゲーション), 我々は、より多くの情報をここで見つけました https://velog.io/@seochan99/자료구조-탐색Search-1-이진-탐색-트리-11-2-2-12dk80hcテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol