首页 > 代码库 > 二叉搜索树

二叉搜索树

二叉搜索树:

二叉树的查找很简单,先序后序中序都可以,一开始要判断是否为空。

插入要判断一下是否存在,查找时同时记录其父节点,然后直到找到空节点,插入。

删除比较复杂一点:

逐一判断:

先判断是否为空,然后查找到要删除的节点p,并记录其父节点q,如果查不到,返回false;

当p节点有两个子树时,查到其中序遍历的后继节点,即排序后的之后以为,记为s。查找的同时记录s的父节点r,然后将s的值复制给p,然后以s为p,r为q,将问题转换为p节点只有最多一棵子树的情况,即之后的情况。这里是因为其为中序遍历的第一个节点,这此时的p点绝对没有左子树。

当p节点只有一颗子树或没有时,将其的子树或者null赋值个c,为p的子节点,然后让其代替p在q的位置。

当p节点为根节点时,则c节点为根节点。

释放p的内存。


代码如下:


#include "BSTree.h"

template<typename T>
bool BSTree<T>::Search(const T& x) const{
	if(!root) return false;
	return Search(root,x);
}

template<typename T>
bool BSTree<T>::Search(const BTNode<T> *p, const T& x)const{
	if(!p)return false;
	if(p->element == x)return true;
	if(p->lchild)return Search(p->lchild,x);
	if(p->rchild)return Search(p->rchild,x);
	return false;
}
template<typename T>
bool BSTree<T>:: Insert(const T& x){
	if(!root)
		root = new BTNode<T>(x);
	else{
		BTNode<T>* p = root,q = 0;
		while(p){
			q = p;
			if(p->element==x)return false;
			else if(x < p->element)p = p->lchild;
			else p = p->rchild;
		}
		p = new BTNode<T>(x);
		q -> rchild = p;
	}
	return true;
}


template<typename T>
bool BSTree<T>::Remove(const T& x){
	BTNode<T> *c,*s,*r,*p = root,*q = 0;
	if(p)return false;
	while(p &&p->element != x){
		q = p;
		if(x < p->element) p = p->lchild;
		else p =  p->rchild;
	}
	if(!p ) return false;
	if(p->lchild && p->rchild){
		s = p->rchild;r = p;
		while(r->lchild){
			r = s;
			s = s->lchild;
		}
		p->element = s->element;
		p = s;
		q = r;
	}
	if(p ->lchild ) c = p->rchild;
	else c = p->lchild;
	if( p == root) root = c;
	else if(p == q->lchild) q->lchild = c;
	else q->rchild  = c;
	delete p;
	return true;
}



头文件:

#ifndef BSTREE
#define BSTREE

template <typename T>
struct BTNode
{
	BTNode(){lchild =rchild = 0;}
	BTNode(const T& x){
		element = x;
		lchild =rchild = 0;
	}
	BTNode<T>* lchild,*rchild;
	T element;
}; 

template <typename T>
class BSTree{
public:
	BSTree(){root = 0;}
	bool Search(const T& x) const;
	bool Insert(const T& x);
	bool Remove(const T& x);
private:
	bool Search(const BTNode<T> *p, const T& x)const;
protected:
	BTNode<T>* root;

};

#endif






二叉搜索树