果然这些数据结构还是要自己写一遍才熟悉啊。。。这次也是加深了我对指针的认识,以前都不怎么注意的
二叉查找树
二叉查找树,每一个节点有左右儿子,然后这个节点的值大于左儿子,小于右儿子,那么根据定义不难得出代码,先配个图以便于理解(网上也有不少)~
二叉查找树一共有三种操作:查询,删除,插入
结点结构体:
struct Node
{
Node *lchild,*rchild;
int key;
};
插入:按照定义通过递归插入
Node* Node_Insert(int x,Node *root) //这里其实也可以直接引用传入地址编辑
{
Node* newnode = new Node();
newnode->key = x;
newnode->lchild = NULL;
newnode->rchild = NULL;
if(!root){
root = newnode;
return root;
}
else if(x>root->key)root->rchild = Node_Insert(x,root->rchild);
else root->lchild = Node_Insert(x,root->lchild);
//return root;
}
查找:按照定义递归查找,小于节点往左走,否则往右,直到找到节点或者到达一个空节点
bool Node_search(int key,Node* root)
{
//cout<<"??"<<endl;
if(!root) return false;
if(root->key==key) return true;
if(root->key<key) return Node_search(key,root->rchild);
else return Node_search(key,root->lchild);
}
int Node_Delete_search(int key,Node *&root)
{
if(!root->lchild)
{
Node* t = root;
int r = t->key;
root = root->rchild;
delete root;
return r;
}
else return Node_Delete_search(key,root->rchild);
}
void Node_Delete(int key,Node *&root)
{
if(!root) return;
if(root->key==key){
if(root->lchild&&root->rchild) root->key= Node_Delete_search(key,root->rchild);
else{
Node* t = new Node();
if(root->lchild) root = root->lchild;
else root = root->rchild;
delete t;
}
}
else
{
if(key>root->key) Node_Delete(key,root->rchild);
else Node_Delete(key,root->lchild);
}
}