当前位置: 首页 > wzjs >正文

进一步加强区门户网站建设管理中企动力总部在哪里

进一步加强区门户网站建设管理,中企动力总部在哪里,问卷调查网站,今天体育新闻最新消息搜索二叉树 二叉搜索树的概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都…

搜索二叉树

二叉搜索树的概念:
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:
若它的左子树不为空,则左子树上所有节点的值都小于根节点的值
若它的右子树不为空,则右子树上所有节点的值都大于根节点的值
它的左右子树也分别为二叉搜索树。
我们之前学的list,string,vector都叫做序列式容器,而我们学的二叉搜索树叫做关联式容器,
在这里插入图片描述

二叉搜索树的的一些常见的接口

BSTree()//构造
BSTree(const BSTree<K>&t)//拷贝构造
BSTree<K>& operator=(BSTree<K>t)//赋值运算符重载
~BSTree()//析构
//非递归的版本实现
bool Insert(const K& key)//插入
bool Find(const K& key)//查找
bool Erase(const K& key)//删除(重点的讲解实现思路)
//递归版本的实现
CopyTree(Node* root)//树的拷贝
void destory(Node*& root)//销毁
bool _EraseR(Node*& root,const K& key)
void _Inorder(Node* root)//中序遍历
bool _FindR(Node* root, const K& key)
bool _InsertR(Node*& root, const K& key)

非递归版本的插入
实现思路:二叉搜索树要满足根的左子树要比根要小,右子树要比根要大;我们要插入key的时候,首先就要判断一下key比根要大还是小,比根小往左边走,比根大往右子树去找;相等的话就不插入;

bool Insert(const K& key)
{if (_root == nullptr){_root = new Node(key);return true;}//不为空的时候Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}else//相等的话{return false;}}//开始插入cur = new Node(key);if (parent->_key > key){parent->_left = cur;}else{parent->_right = cur;}return true;
}

find的接口的实现

bool Find(const K& key)
{Node* cur = _root;while (cur){if (cur->_key > key){cur = cur->_left;}else if (cur->_key < key){cur = cur->_right;}else{return true;}}//找不到return false;
}

删除接口的实现思路
在这里插入图片描述
我们要考虑到这三种情况,情况一和情况二可以归为一类,我们需要让parent->left/right=cur->left/right;
第三种才是直接删不好删的,我们可以使用一个替换法,我们知道二叉搜索树的概念是它的左子树永远是比根小的,右子树是比根大的,我们可以根据这个性质去左子树的里面去找他的最大的那个树也就是左子树的最右子树是左子树最大的,或者去右子树里面去找右子树中最左子树的那个节点;

bool Erase(const K& key)
{Node* cur = _root;Node* parent = nullptr;while (cur){if (cur->_key > key){parent = cur;cur = cur->_left;}else if (cur->_key < key){parent = cur;cur = cur->_right;}else//开始删除{if (cur->_left == nullptr){if (cur == _root){_root = cur->_right;}else{if (parent->_left == cur){parent->_left = cur->_right;}else{parent->_right = cur->_right;}}}else if (cur->_right == nullptr){if (_root == cur){_root = cur->_left;}else{if (parent->_left == cur){parent->_left = cur->_left;}else{parent->_right = cur->_left;}}}//俩边都不为空的时候else{Node* rightmin = cur->_right;//去最右边找最小值parent = cur;while (rightmin->_left){parent = rightmin;rightmin = rightmin->_left;}//替换位置swap(cur->_key, rightmin->_key);if (parent->_left == rightmin){parent->_left = rightmin->_left;}else{parent->_right = rightmin->_left;}cur = rightmin;}delete cur;cur = nullptr;return true;}}return false;
}

递归版本的实现

bool _FindR(Node* root, const K& key)
{if (root == nullptr)return false;if (root->_key > key)return _FindR(root->_left, key);else if (root->_key < key)return _FindR(root->_right, key);elsereturn true;
}
bool _InsertR(Node*& root, const K& key)
{if (root == nullptr){root = new Node(key);return true;}if (root->_key > key){return _InsertR(root->_left, key);}else if (root->_key < key){return _InsertR(root->_right, key);}else{return false;}
}
bool _EraseR(Node*& root,const K& key)
{if (root == nullptr)return false;if (root->_key > key){return _EraseR(root->_left, key);}else if (root->_key < key){return _EraseR(root->_right, key);}else//开始删除{if (root->_left == nullptr){root = root->_right;}else if (root->_right == nullptr){root = root->_left;}else{Node* leftmax = root->_left;//找左半边的最大值while (leftmax->_right){leftmax = leftmax->_right;}swap(leftmax->_key, root->_key);root = leftmax;return _EraseR(root->_left, key);}return true;}
}

四个默认构造的实现

BSTree():_root(nullptr)
{}
BSTree(const BSTree<K>&t)
{_root=CopyTree(t._root);
}
BSTree<K>& operator=(BSTree<K>t)
{swap(_root, t._root);return *this;
}
~BSTree()
{destory(_root);
}
Node* CopyTree(Node* root)
{if (root == nullptr){return nullptr;}Node* cur = new Node(root->_key);cur->_left = CopyTree( root->_left);cur->_right = CopyTree(root->_right);return cur;
}
void destory(Node*& root)
{if (root == nullptr)return;destory(root->_left);destory(root->_right);delete root;root = nullptr;
}

前序,中序,后序的非递归实现

前序
我们之前都是借助递归来实现的,因为比较简单,我们想要实现非递归我们得知道我们在递归的时候是怎么访问呢?根->左子树->右子树
在这里插入图片描述

vector<int>  preorder(Node* root)
{stack<Node*>st;vector<int>vs;Node* cur = root;while (cur || !st.empty()){//取出当前节点入栈while (cur){vs.push_back(cur->_key);//存储根的值st.push(cur);cur = cur->_left;}//开始访问右节点if (!st.empty()){auto top = st.top();st.pop();cur = top->_right;}}return vs;
}

中序的非递归实现
跟前序实现思路一样,就是访问根的时机不同而已;我们是在左子树访问完了之后才开始访问;

vector<int>  INorder(Node* root)
{stack<Node*>st;vector<int>vs;Node* cur = root;while (cur || !st.empty()){//取出当前节点入栈while (cur){st.push(cur);cur = cur->_left;}//开始访问右节点if (!st.empty()){auto top = st.top();st.pop();vs.push_back(cur->_key);cur = top->_right;}}return vs;
}

后序的非递归实现

基本大体思路一样,就是有一个难点什么时候访问根呢?我们在入栈的时候一共会有俩次访问根的机会
在这里插入图片描述

	vector<int>  Postorder(Node* root){stack<Node*>st;vector<int>vs;Node* cur = root;Node* prev = nullptr;while (cur || !st.empty()){//取出当前节点入栈while (cur){st.push(cur);cur = cur->_left;}//开始访问右节点if (!st.empty()){auto top = st.top();prev = top;if (top->right == nullptr || top->right == prev){st.pop();vs.push_back(top->_key);}else{cur = top->_right;}}}return vs;}
http://www.dtcms.com/wzjs/790690.html

相关文章:

  • 网站wordpresswordpress搭建视频
  • 图文消息点击进去是自己的网站在游戏网站做中介合法
  • 兰州网络营销网站乌海市建设工程网站
  • 学校网站的建设方案务川县住房和城乡建设局网站
  • 做动漫网站南庄顺德网站建设
  • 室内效果图代做网站济南制作网站企业
  • 做网站ps注意事项深圳的产品设计公司
  • 为网站优势公司建站比较好的
  • 自己办网站中国住房和城乡建设局官网
  • 用dw制作影视网站怎样做专业做视频的网站有哪些内容
  • 易优cms仿站教程国内个人网站设计欣赏
  • 福州网站建设服务平台江苏建设准考证打印在哪个网站
  • 公司网站开发 flask家居公司网站建设方案ppt
  • 孟村网站建设公司dw软件怎么做网页
  • 网站后台管理系统多少钱潍坊高新建设局网站
  • 建设企业网站的具体步骤网上卡片制作
  • 定制企业网站开发公司seo搜索引擎优化实训
  • 石家庄做网站好的公司推荐定制开发app价格
  • 网站的主流趋势5118网站查询
  • 电子商务网站建设与管理最新试卷wordpress 文章菜单
  • 网站优化qq群网站建设请款报告
  • 建设银行个人网站个人客户网站开发亿玛酷信赖
  • 网站维护工程师薪酬社区源码app
  • 在线设计图片网站总结大型企业网站建设
  • 龙岩网站建设企业广西南宁网站推广
  • 网站建设kaodezhu阿里云域名购买官网
  • 北京网站建设的公网页版梦幻西游五色石攻略
  • 网站开发项目描述范文个人简历模板可编辑免费
  • 智能网站系统可以做app吗app开发公司大连有几家
  • 如何做购物网站的限购功能代码免费的企业网站建设流程