#include<iostream>
using namespace std;
template <typename T>
struct BSNode
{
//初始化 只赋予权值
BSNode(T t):value(t),lchild(NULL),rchild(NULL) {}
//BSNode() = default;
T value; //节点的值
BSNode<T>* lchild; //左孩子
BSNode<T>* rchild; //右孩子
BSNode<T>* parent; //节点的双亲
};
template <typename T>
class BSTree
{
public:
//初始化为空树
BSTree():root(NULL){}
//外部接口
bool preOrder(); //前序遍历
bool inOrder(); //中序遍历
bool postOrder(); //后序遍历
BSNode<T>* search_recursion(T key); //递归查找指定节点
BSNode<T>* search__iterator(T key); //迭代查找指定节点
T search_maxnum(); //查找最大元素
T search_minnum(); //查找最小元素
bool insert(T key); //插入指定结点
bool remove(T key); //删除指定结点
bool destory(); //销毁二叉树
bool print(); //打印二叉树
private:
BSNode<T>* root; //根节点
//内部接口
bool preOrder(BSNode<T>* pnode);
bool inOrder(BSNode<T>* pnode);
bool postOrder(BSNode<T>* pnode);
BSNode<T>* search(BSNode<T>* & p,T key);
bool remove(BSNode<T>* pnode,T key);
T search_maxnum(BSNode<T>* pnode);
T search_minnum(BSNode<T>* pnode);
bool destory(BSNode<T>* &pnode);
};
int main()
{
BSTree<int> tree_int;
tree_int.insert(10);
tree_int.insert(20);
tree_int.insert(30);
tree_int.insert(40);
tree_int.insert(25);
tree_int.insert(100);
tree_int.insert(60);
tree_int.insert(55);
cout << endl<< "print:" << endl;
tree_int.print();
BSTree<char> tree_char;
tree_char.insert('C');
tree_char.insert('F');
tree_char.insert('H');
tree_char.insert('G');
tree_char.insert('E');
tree_char.insert('B');
tree_char.insert('D');
tree_char.insert('A');
cout << endl<< "print:" << endl;
tree_char.print();
BSTree<double> tree_double;
tree_double.insert(3.1415926);
tree_double.insert(0.999999);
tree_double.insert(-3.7885);
tree_double.insert(23.98787);
tree_double.insert(8.8888);
tree_double.insert(6.66666);
tree_double.insert(-5.20);
tree_double.insert(5.211314);
cout << endl<< "print:" << endl;
tree_double.print();
return 0;
}
/*insert(T key)*/
template <typename T>
bool BSTree<T>::insert(T key)
{
BSNode<T>* pparent = NULL; //要插入节点的父节点
BSNode<T>* pnode = root;
/*先找到能插入的位置,即此节点的父节点*/
while(pnode!=NULL)
{
pparent = pnode;
if(key < pnode -> value)
pnode = pnode -> lchild;
else if(key > pnode -> value)
pnode = pnode -> rchild;
else
break;
}
/*以元素的值构建新节点*/
pnode = new BSNode<T>(key);
/*空树,新节点即为根节点*/
if(pparent == NULL)
{
root = pnode;
}
else //不是空树
{
if(key < pparent->value)
pparent -> lchild = pnode; //新节点为左孩
else
pparent -> rchild = pnode;
}
pnode -> parent = pparent; //指定新节点的父节点
return true;
}
/*前序遍历*/
template <typename T>
bool BSTree<T>::preOrder(BSNode<T>* pnode)
{
if(pnode != NULL)
{
cout << pnode -> value << ' ';
preOrder(pnode -> lchild);
preOrder(pnode -> rchild);
}
return true;
}
template <typename T>
bool BSTree<T>::preOrder()
{
preOrder(root);
return true;
}
/*中序遍历*/
template <typename T>
bool BSTree<T>::inOrder(BSNode<T>* pnode)
{
if(pnode != NULL)
{
inOrder(pnode -> lchild);
cout << pnode -> value << ' ';
inOrder(pnode -> rchild);
}
return true;
}
template <typename T>
bool BSTree<T>::inOrder()
{
inOrder(root);
return true;
}
/*后序遍历*/
template <typename T>
bool BSTree<T>::postOrder(BSNode<T> *pnode)
{
if(pnode != NULL)
{
postOrder(pnode -> lchild);
postOrder(pnode -> rchild);
cout << pnode -> value << ' ';
}
return true;
}
template <typename T>
bool BSTree<T>::postOrder()
{
postOrder(root);
return true;
}
/*删除某个节点*/
template <typename T>
bool BSTree<T>::remove(BSNode<T>* pnode,T key)
{
BSNode<T> *pdel = NULL, *ppre = NULL,*pnow = pnode,*s,*q;
while(pnow != NULL)
{
if(pnow -> value == key)
break;
//ppre 被删节点的父节点
ppre = pnow;
if(pnow -> value > key)
pnow = pnow -> lchild;
else
pnow = pnow -> rchild;
}//找到要被删除节点
if(pnow == NULL)
return false;
if(pnow -> lchild == NULL)
{
if(ppre == NULL)
root = pnow -> rchild;
else if(ppre -> lchild == pnow)
ppre -> lchild = pnow -> rchild;
else
ppre -> rchild = pnow -> rchild;
delete pnow;
pnow = NULL;
}
else
{
//s 前驱节点
q = pnow;
s = pnow -> lchild;
while(s -> rchild != NULL)
{
q = s;
s = s -> rchild;
}
if(q == pnow)
q -> lchild = s -> lchild;
else
q -> rchild = s -> lchild;
pnow -> value = s -> value;
delete s;
s = NULL;
}
return true;
}
template <typename T>
bool BSTree<T>::remove(T key)
{
remove(root,key);
return true;
}
/*根据指定节点值查找节点--非递归实现*/
template <typename T>
BSNode<T>* BSTree<T>::search__iterator(T key)
{
BSNode<T>* pnode = root;
while(pnode != NULL)
{
if(pnode -> value == key)
return pnode;
else if(pnode -> value > key)
pnode = pnode -> lchild;
else
pnode = pnode -> rchild;
}
return NULL;
}
/*根据指定节点值查找节点--递归实现*/
template <typename T>
BSNode<T>* BSTree<T>::search(BSNode<T>*& pnode,T key)
{
if(pnode == NULL)
return NULL;
if(key == pnode -> value)
return pnode;
//在这打印 节点值,可查看查找顺序
cout << "-----> " << pnode -> value << endl;
if(key < pnode -> value)
return search(pnode -> lchild,key);
return search(pnode -> rchild,key);
}
template <typename T>
BSNode<T>* BSTree<T>::search_recursion(T key)
{
return search(root,key);
}
/*查找最大元素*/
template <typename T>
T BSTree<T>::search_maxnum(BSNode<T>* pnode)
{
if(pnode -> rchild != NULL)
return search_maxnum(pnode -> rchild);
return pnode -> value;
}
template <typename T>
T BSTree<T>::search_maxnum()
{
return search_maxnum(root);
}
/*查找最小元素*/
template <typename T>
T BSTree<T>::search_minnum(BSNode<T>* pnode)
{
if(pnode -> lchild != NULL)
return search_minnum(pnode -> lchild);
return pnode -> value;
}
template <typename T>
T BSTree<T>::search_minnum()
{
return search_minnum(root);
}
//后序遍历递归销毁二叉查找树
template <typename T>
bool BSTree<T>::destory(BSNode<T>* &pnode)
{
if(pnode != NULL)
{
if(pnode -> lchild != NULL)
destory(pnode -> lchild);
if(pnode -> rchild != NULL)
destory(pnode -> rchild);
delete pnode;
pnode = NULL;
}
return true;
}
template <typename T>
bool BSTree<T>::destory()
{
destory(root);
return true;
}
template <typename T>
bool BSTree<T>::print()
{
cout << "前序遍历:";
preOrder();
cout << endl << "中序遍历:";
inOrder();
cout << endl << "后序遍历:";
postOrder();
cout << endl;
return true;
}
模板_树
最新推荐文章于 2022-02-14 16:14:48 发布