1. 程式人生 > >【模板】二叉查詢樹

【模板】二叉查詢樹

果然這些資料結構還是要自己寫一遍才熟悉啊。。。這次也是加深了我對指標的認識,以前都不怎麼注意的

二叉查詢樹

二叉查詢樹,每一個節點有左右兒子,然後這個節點的值大於左兒子,小於右兒子,那麼根據定義不難得出程式碼,先配個圖以便於理解(網上也有不少)~


二叉查詢樹一共有三種操作:查詢,刪除,插入


結點結構體:

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);
	}
}