关注
#include "BSTree.h"
#include<iostream>
using namespace std;
//前序遍历二叉树
template<class T>
void BSTree<T>::preOrder(BSTNode<T> *tree) const
{
if(tree!=nullptr)
{
cout<<tree->key<<" ";
preOrder(tree->left);
preOrder(tree->right);
}
}
template<class T>
void BSTree<T>::preOrder()
{
preOrder(mRoot);
}
//中序遍历二叉树
template<class T>
void BSTree<T>::inOrder(BSTNode<T> *tree) const
{
if(tree!=nullptr)
{
inOrder(tree->left);
cout<<tree->key<<" ";
inOrder(tree->right);
}
}
template<class T>
void BSTree<T>::inOrder()
{
inOrder(mRoot);
}
//后序遍历二叉树
template<class T>
void BSTree<T>::postOrder(BSTNode<T> *tree) const
{
if(tree!=nullptr)
{
postOrder(tree->left);
postOrder(tree->right);
cout<<tree->key<<" ";
}
}
template<class T>
void BSTree<T>::postOrder()
{
postOrder(mRoot);
}
//递归实现查找二叉树中键值为key的节点
template<class T>
BSTNode<T>* BSTree<T>::search(BSTNode<T> *x, T key)const
{
if(x->key==key)
return x;
else if(x->key>key)
return search(x->left,key);
else
return search(x->right,key);
}
template<class T>
BSTNode<T>* BSTree<T>::search(T key)
{
return search(mRoot,key);
}
//非递归实现查找二叉树中键值为key的节点
template<class T>
BSTNode<T>* BSTree<T>::iterativeSearch(BSTNode<T> *x, T key)const
{
while(x!=nullptr)
{
if(x->key==key)
return x;
else if(x->key>key)
x=x->left;
else
x=x->right;
}
return x;
}
template<class T>
BSTNode<T>* BSTree<T>::iterativeSearch(T key)
{
return iterativeSearch(mRoot,key);
}
//查找最小节点,返回最小节点
template<class T>
BSTNode<T>* BSTree<T>::minimum(BSTNode<T> *tree)
{
while(tree->left!=nullptr)
{
tree=tree->left;
}
return tree;
}
template<class T>
T BSTree<T>::minimum()
{
return minimum(mRoot)->key;
}
//查找最大节点,返回最大节点
template<class T>
BSTNode<T>* BSTree<T>::maximum(BSTNode<T> *tree)
{
while(tree->right!=nullptr)
{
tree=tree->right;
}
return tree;
}
template<class T>
T BSTree<T>::maximum()
{
return maximum(mRoot)->key;
}
//插入节点到二叉搜索树
template<class T>
void BSTree<T>::insert(BSTNode<T> *&tree, BSTNode<T> *z)
{
if(tree==nullptr)
{
tree=z;
return;
}
BSTNode<T>* p=nullptr;
BSTNode<T>* tmp=tree;
while(tmp)
{
if(tmp->key==z->key)
return;
p=tmp;
if(tmp->key>z->key)
{
tmp=tmp->left;
}
else
{
tmp=tmp->right;
}
}
if(p->key>z->key)
p->left=z;
else
p->right=z;
}
template<class T>
void BSTree<T>::insert(T key)
{
BSTNode<T>* node=new BSTNode<T>(key);
insert(mRoot,node);
}
//删除节点
template<class T>
BSTNode<T>* BSTree<T>::remove(BSTNode<T> *&tree, BSTNode<T> *z)
{
if(tree==nullptr) return;
BSTNode<T>* pcur=tree;
while(pcur!=nullptr && pcur->key!=z->key)
{
if(pcur->key>z->key)
pcur=pcur->left;
else
pcur=pcur->right;
}
if(pcur==nullptr)
return;
if(!pcur->left && !pcur->right)
{
delete pcur;
pcur=nullptr;
return;
}
if(pcur->left && pcur->right)
{
BSTNode<T>* tmp=pcur->right;
while(tmp->left)
tmp=tmp->left;
if(pcur->right=tmp)
{
pcur->right=tmp->right;
delete tmp;
tmp=nullptr;
return;
}
BSTNode<T>* node=pcur;
pcur=tmp;
tmp=node;
delete tmp;
tmp=nullptr;
return;
}
if(pcur->left)
{
BSTNode<T>* p=pcur->parent;
if(p==nullptr)
{
tree=pcur->left;
delete pcur;
pcur=nullptr;
return;
}
if(p->right==pcur)
{
p->right=pcur->left;
}
if(p->left==pcur)
{
p->left=pcur->left;
}
return;
}
if(pcur->right)
{
BSTNode<T>* p=pcur->parent;
if(p==nullptr)
{
tree=pcur->right;
delete pcur;
pcur=nullptr;
return;
}
if(p->right==pcur)
{
p->right=pcur->right;
}
if(p->left==pcur)
{
p->left=pcur->right;
}
return;
}
}
template<class T>
void BSTree<T>::remove(T key)
{
BSTNode<T>* node=new BSTNode<T>(key);
remove(mRoot,node);
}
//销毁二叉树
template<class T>
void BSTree<T>::destory(BSTNode<T> *&tree)
{
if(tree)
{
BSTNode<T>* l=tree->left;
BSTNode<T>* r=tree->right;
delete tree;
destory(l);
destory(r);
}
}
template<class T>
void BSTree<T>::destory()
{
destory(mRoot);
}
//查找节点x的后继节点
template<class T>
BSTNode<T>* BSTree<T>::successor(BSTNode<T> *x)
{
if(x==nullptr || x->right==nullptr) return nullptr;
BSTNode<T>* node=x->right;
while(node->left)
node=node->left;
return node;
}
//查找节点x的前驱节点
template<class T>
BSTNode<T>* BSTree<T>::predecessor(BSTNode<T> *x)
{
if(x==nullptr) return nullptr;
if(x->left)
{
x=x->left;
while(x->right)
x=x->right;
return x;
}
BSTNode<T>* p=x->parent;
if(p==nullptr) return p;
if(p->right==x) return p;
if(p->left==x)
{
BSTNode<T>* q=p->parent;
while(q->right!=p)
{
p=q;
q=p->parent;
}
return q;
}
}
查看原帖
点赞 评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# xx岗简历求拷打 #
9098次浏览 105人参与
# 求职季如何保持心态不崩 #
212522次浏览 1459人参与
# 开工第一帖 #
30449次浏览 643人参与
# 面试反问你会问什么 #
168682次浏览 1738人参与
# 有转正机会的小厂实习值得去吗? #
8978次浏览 100人参与
# 你听到的“最没用”的秋招建议 #
51389次浏览 324人参与
# 工作不开心辞职是唯一出路吗 #
9651次浏览 40人参与
# 产品面经 #
263496次浏览 2177人参与
# 掌握什么AI技能,会为你的求职大大加分 #
7779次浏览 350人参与
# 你收到了团子的OC了吗 #
1532551次浏览 11825人参与
# 携程求职进展汇总 #
889382次浏览 5882人参与
# 远程面试的尴尬瞬间 #
328486次浏览 1917人参与
# 制造业的秋招小结 #
144855次浏览 2093人参与
# 拼多多求职进展汇总 #
848455次浏览 6593人参与
# 实习要如何选择和准备? #
145222次浏览 1566人参与
# 面试题刺客退退退 #
535410次浏览 7533人参与
# 非技术岗是怎么找实习的 #
295522次浏览 2594人参与
# 找工作时的取与舍 #
122957次浏览 878人参与
# 现在还是0offer,延毕还是备考 #
1299156次浏览 7929人参与
# 你最讨厌面试被问什么 #
8953次浏览 108人参与
