#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; } }
点赞 评论

相关推荐

团子请爱我一次_十月...:不是戈门,干哪来了,这就是java嘛
点赞 评论 收藏
分享
来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务