BST 삽입, 삭제, 높은 차원 추구 실현
9767 단어 BST
BST 삽입, 삭제, 높은 차원 추구 실현
제목.
두 갈래 검색서를 실현하고 지령을 통해 상응하는 기능을 완성할 수 있다.I num은 num 값을 삽입하고, 나무가 비어 있으면 두 갈래 검색 트리를 만듭니다.D num은 트리에서 num 값을 삭제합니다. 3.H는 현재 트리의 깊이를 나타냅니다. 4.B 차원에서 이 두 갈래 검색 트리를 옮겨다니기
코드
/************************************************************************* > File Name: BinarySearchTree.cpp > Author: > Mail: > Created Time: Tue 27 Sep 2016 09:12:54 PM CST ************************************************************************/
#include<iostream>
#include<queue>
#include<string>
#include<sstream>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v) : val(v), left(nullptr), right(nullptr) {};
};
class Tree
{
public:
void Insert(int v);
void Delete(int v);
int GetHeight();
void TraverseByLevelOrder();
Tree() { root = new (TreeNode*); *root = nullptr; };
~Tree() { while(*root) { Delete((*root)->val); } delete root; root = nullptr; };
private:
void Transplant(TreeNode* pNode, TreeNode* pParent, TreeNode* pReplace);
TreeNode* FindMin(TreeNode* pNode, TreeNode** ppParent);
void Delete(TreeNode* pNode, TreeNode* pParent);
int GetHeight(TreeNode* pNode);
void TraverseByLevelOrder(TreeNode* pNode);
TreeNode** root;
};
void Tree::Insert(int v)
{
TreeNode* pNode = new TreeNode(v);
if(*root == nullptr)
{
*root = pNode;
}
else
{
TreeNode* pParent = nullptr;
TreeNode* pCur = *root;
while(pCur)
{
pParent = pCur;
if(pNode->val <= pCur->val)
{
pCur = pCur->left;
}
else
{
pCur = pCur->right;
}
}
if(pNode->val <= pParent->val)
{
pParent->left = pNode;
}
else
{
pParent->right = pNode;
}
}
}
TreeNode* Tree::FindMin(TreeNode* pNode, TreeNode** ppParent)
{
while(pNode->left)
{
ppParent = &pNode;
pNode = pNode->left;
}
return pNode;
}
void Tree::Transplant(TreeNode* pNode, TreeNode* pParent, TreeNode* pReplace)
{
if(pParent)
{
if(pNode == pParent->left)
{
pParent->left = pReplace;
}
else
{
pParent->right = pReplace;
}
}
else
{
*root = pReplace;
}
}
void Tree::Delete(TreeNode* pNode, TreeNode* pParent)
{
if(pNode->left == nullptr)
{
Transplant(pNode, pParent, pNode->right);
}
else if (pNode->right == nullptr)
{
Transplant(pNode, pParent, pNode->left);
}
else
{
TreeNode** ppParent = nullptr;
TreeNode* RightMin = FindMin(pNode->right, ppParent);
if(RightMin != pNode->right) /* */
{
Transplant(RightMin, *ppParent, RightMin->right);
RightMin->right = pNode->right;
}
Transplant(pNode, pParent, RightMin);
RightMin->left = pNode->left;
}
delete pNode;
pNode = nullptr;
}
void Tree::Delete(int v)
{
if(*root)
{
TreeNode* pParent = nullptr;
TreeNode* pNode = *root;
while(pNode)
{
if(pNode->val == v)
Delete(pNode, pParent);
else
{
pParent = pNode;
if(pNode->val < v)
{
pNode = pNode->right;
}
else
{
pNode = pNode->left;
}
}
}
}
}
int Tree::GetHeight(TreeNode* pNode)
{
if(pNode == nullptr)
return 0;
return max(GetHeight(pNode->left), GetHeight(pNode->right)) + 1;
}
int Tree::GetHeight()
{
int h = 0;
if(*root)
{
TreeNode* pCur = *root;
h = GetHeight(pCur);
}
return h;
}
void Tree::TraverseByLevelOrder(TreeNode* pNode)
{
queue<TreeNode*> myQueue;
myQueue.push(pNode);
while(!myQueue.empty())
{
TreeNode* pCur = myQueue.front();
myQueue.pop();
cout<<pCur->val<<'\t';
if(pCur->left)
myQueue.push(pCur->left);
if(pCur->right)
myQueue.push(pCur->right);
}
cout<<endl;
}
void Tree::TraverseByLevelOrder()
{
if(*root)
{
TreeNode* pCur = *root;
TraverseByLevelOrder(pCur);
}
}
int main()
{
string command;
stringstream ss;
Tree BST;
while(getline(cin, command))
{
char action;
int parameter;
ss.str(command);
ss.clear();
ss>>action;
switch(action)
{
case 'I':
{
ss>>parameter;
BST.Insert(parameter);
break;
}
case 'D':
{
ss>>parameter;
BST.Delete(parameter);
break;
}
case 'H':
{
cout<<BST.GetHeight()<<endl;
break;
}
case 'B':
{
BST.TraverseByLevelOrder();
break;
}
default:
break;
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Javascript 자료구조 06 : Tree 삭제Tree의 삭제는 삭제하고자 하는 Node의 Child가 몇개인지에 따라 경우를 나누어 진행한다. 1. No Child Parent Node와의 link를 끊어준다. 2. One Child Parent Node와 C...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.