【模板】二叉查詢樹
阿新 • • 發佈:2018-11-07
果然這些資料結構還是要自己寫一遍才熟悉啊。。。這次也是加深了我對指標的認識,以前都不怎麼注意的
二叉查詢樹
二叉查詢樹,每一個節點有左右兒子,然後這個節點的值大於左兒子,小於右兒子,那麼根據定義不難得出程式碼,先配個圖以便於理解(網上也有不少)~
二叉查詢樹一共有三種操作:查詢,刪除,插入
結點結構體:
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); } }