关注
#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;
}
}
查看原帖
点赞 评论
相关推荐
10-19 18:20
福建师范大学 Java
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招 点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 校招生月薪1W算什么水平 #
34256次浏览 188人参与
# 哪一瞬间觉得自己长大了 #
38200次浏览 493人参与
# “vivo”个offer #
38815次浏览 280人参与
# 如果上班像打游戏,你最想解锁什么技能 #
8136次浏览 70人参与
# vivo工作体验 #
27895次浏览 124人参与
# 为了实习逃课值吗? #
28613次浏览 270人参与
# 工作后明白的那些道理 #
21705次浏览 225人参与
# 一人一个landing小技巧 #
123849次浏览 1441人参与
# 我是面试官,请用一句话让我破防 #
26584次浏览 128人参与
# 实习最想跑路的瞬间 #
87434次浏览 542人参与
# 中美关税战对我们有哪些影响 #
42963次浏览 361人参与
# 机械制造2023笔面经 #
149532次浏览 840人参与
# 如果重来一次你还会读研吗 #
201592次浏览 1932人参与
# AI时代,哪些岗位最容易被淘汰 #
3318次浏览 27人参与
# 中美关系回暖,你会选择出海吗? #
6651次浏览 107人参与
# 华为保温 #
107617次浏览 407人参与
# 哪些行业值得去? #
5335次浏览 50人参与
# i人适合做什么工作 #
11364次浏览 97人参与
# 美团开奖 #
222491次浏览 1148人参与
# 读研or工作,哪个性价比更高? #
78216次浏览 768人参与
# 如果秋招能重来,我会____ #
37418次浏览 300人参与
查看14道真题和解析