递归实现二叉查找树 C++
2013-04-14 17:13
330 查看
把这些都写到博客中不是为了其他的目的,只是为了以后找工作的时候能提前看看复习一下,脑子里好有一些印象。
#include <iostream>
using namespace std;
template<class T>
class TreeNode
{
public:
TreeNode():lson(NULL),rson(NULL),freq(1)
{}
T data;
unsigned int freq;
TreeNode *lson;
TreeNode *rson;
};
template<class T>
class BST
{
private:
TreeNode<T> *root;
void insertpri(TreeNode<T> *&node,T x);
TreeNode<T>* findpri(TreeNode<T>* node,T x);
void insubtree(TreeNode<T>* node);
void Deletepri(TreeNode<T>* &node,T x);
public:
BST():root(NULL){}
void insert(T x);
TreeNode<T>*find(T x);
void Delete(T x);
void traversal();
};
template<class T>
void BST<T>::insertpri(TreeNode<T> *&node,T x)
{
if(node==NULL)
{
node=new TreeNode<T>();
node->data=x;
return;
}
if (node->data>x)
{
insertpri(node->lson,x);
}
else if(node->data<x)
{
insertpri(node->rson,x);
}
else
++(node->freq);
}
template<class T>
void BST<T>::insert(T x)
{
insertpri(root,x);
};
template<class T>
TreeNode<T> *BST<T>::findpri(TreeNode<T>* node,T x)
{
if(node==NULL)
{
return NULL;
}
if(node->data>x)
{
return findpri(node->lson,x);
}
else if(node->data<x)
{
return findpri(node->rson,x);
}
else return node;
}
template<class T>
TreeNode<T>* BST<T>::find(T x)
{
return findpri(root,x);
};
template<class T>
void BST<T>::Deletepri(TreeNode<T>* &node,T x)
{
if (node==NULL)
return;
if(x<node->data)
Deletepri(node->lson,x);
else if(x>node->data)
Deletepri(node->rson,x);
else
{
if(node->lson&&node->rson)
{
TreeNode<T>* temp=node->rson;
while(temp->lson!=NULL)
temp=temp->lson;
node->data=temp->data;
node->freq=temp->freq;
Deletepri(node->rson,temp->data);
}
else
{
TreeNode<T>* temp=node;
if(node->lson==NULL)
node=node->rson;
else if(node->rson==NULL)
node=node->lson;
delete(temp);
}
}
return;
};
template<class T>
void BST<T>::Delete(T x)
{
Deletepri(root,x);
};
template<class T>
void BST<T>::insubtree(TreeNode<T>* node)
{
if (node==NULL)
return;
insubtree(node->lson);
cout<<node->data<<" ";
insubtree(node->rson);
}
template<class T>
void BST<T>::traversal()
{
insubtree(root);
}
int main()
{
BST<int> m_bTree;
m_bTree.insert(15);
m_bTree.insert(5);
m_bTree.insert(3);
m_bTree.insert(12);
m_bTree.insert(13);
m_bTree.insert(10);
m_bTree.insert(6);
m_bTree.insert(7);
m_bTree.insert(16);
m_bTree.insert(20);
m_bTree.insert(18);
m_bTree.insert(23);
m_bTree.Delete(5);
m_bTree.traversal();
system("pause");
return 0;
}
#include <iostream>
using namespace std;
template<class T>
class TreeNode
{
public:
TreeNode():lson(NULL),rson(NULL),freq(1)
{}
T data;
unsigned int freq;
TreeNode *lson;
TreeNode *rson;
};
template<class T>
class BST
{
private:
TreeNode<T> *root;
void insertpri(TreeNode<T> *&node,T x);
TreeNode<T>* findpri(TreeNode<T>* node,T x);
void insubtree(TreeNode<T>* node);
void Deletepri(TreeNode<T>* &node,T x);
public:
BST():root(NULL){}
void insert(T x);
TreeNode<T>*find(T x);
void Delete(T x);
void traversal();
};
template<class T>
void BST<T>::insertpri(TreeNode<T> *&node,T x)
{
if(node==NULL)
{
node=new TreeNode<T>();
node->data=x;
return;
}
if (node->data>x)
{
insertpri(node->lson,x);
}
else if(node->data<x)
{
insertpri(node->rson,x);
}
else
++(node->freq);
}
template<class T>
void BST<T>::insert(T x)
{
insertpri(root,x);
};
template<class T>
TreeNode<T> *BST<T>::findpri(TreeNode<T>* node,T x)
{
if(node==NULL)
{
return NULL;
}
if(node->data>x)
{
return findpri(node->lson,x);
}
else if(node->data<x)
{
return findpri(node->rson,x);
}
else return node;
}
template<class T>
TreeNode<T>* BST<T>::find(T x)
{
return findpri(root,x);
};
template<class T>
void BST<T>::Deletepri(TreeNode<T>* &node,T x)
{
if (node==NULL)
return;
if(x<node->data)
Deletepri(node->lson,x);
else if(x>node->data)
Deletepri(node->rson,x);
else
{
if(node->lson&&node->rson)
{
TreeNode<T>* temp=node->rson;
while(temp->lson!=NULL)
temp=temp->lson;
node->data=temp->data;
node->freq=temp->freq;
Deletepri(node->rson,temp->data);
}
else
{
TreeNode<T>* temp=node;
if(node->lson==NULL)
node=node->rson;
else if(node->rson==NULL)
node=node->lson;
delete(temp);
}
}
return;
};
template<class T>
void BST<T>::Delete(T x)
{
Deletepri(root,x);
};
template<class T>
void BST<T>::insubtree(TreeNode<T>* node)
{
if (node==NULL)
return;
insubtree(node->lson);
cout<<node->data<<" ";
insubtree(node->rson);
}
template<class T>
void BST<T>::traversal()
{
insubtree(root);
}
int main()
{
BST<int> m_bTree;
m_bTree.insert(15);
m_bTree.insert(5);
m_bTree.insert(3);
m_bTree.insert(12);
m_bTree.insert(13);
m_bTree.insert(10);
m_bTree.insert(6);
m_bTree.insert(7);
m_bTree.insert(16);
m_bTree.insert(20);
m_bTree.insert(18);
m_bTree.insert(23);
m_bTree.Delete(5);
m_bTree.traversal();
system("pause");
return 0;
}
相关文章推荐
- 二分查找的C++非递归实现
- LinuxC/C++编程基础(9) 二叉查找树的实现
- (以实现)c++非递归层次二叉树
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
- 20170219C++项目班02_02递归下降算法/解析器/Scanner实现
- C/C++中关于递归的实现细节的总结
- 使用C/C++实现对字符串的反转(递归和非递归)
- N皇后问题(递归+回溯)的C++实现
- C++递归与非递归实现链表的反转
- C++递归实现全排列
- 二叉查找树之——递归实现
- 递归实现数字的组合(C++)
- 打靶问题c++代码递归实现——程序员面试宝典
- c/c++实现二叉树前序,中序和后序的递归和非递归遍历
- 《算法导论》12、二叉查找树(C++实现)
- 汉诺塔C++版的递归实现。。。。
- 全排列的递归和非递归实现(permutation)(C++)
- C++实现二叉树的递归和非递归遍历方法
- C++模板实现二叉查找树(四 广度优先遍历)