如何进行搜索二叉树分析
发表于:2024-10-27 作者:千家信息网编辑
千家信息网最后更新 2024年10月27日,如何进行搜索二叉树分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、搜索二叉树1、定义:它是一棵排序二叉树,可为空树。2、性质:每个
千家信息网最后更新 2024年10月27日如何进行搜索二叉树分析
如何进行搜索二叉树分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
一、搜索二叉树
1、定义:它是一棵排序二叉树,可为空树。
2、性质:
每个节点都有一个作为搜索依据的关键码(key),所有节点的关键码互不相同;
左子树上所有节点的关键码(key)都小于根节点的关键码(key);
右子树上所有节点的关键码(key)都大于根节点的关键码(key);
左、右子树都是二叉搜索树。
二、源代码
1、定义节点
templatestruct BSTreeNode{ BSTreeNode *_left;//左节点 BSTreeNode *_right;//右节点 K _key;//节点权值 V _value; BSTreeNode(const K& key,const V& value) :_key(key) ,_value(value) ,_left(NULL) ,_right(NULL) {}};
2、搜索二叉树及其相关实现
templateclass BSTree{ typedef BSTreeNode Node;public: BSTree() :_root(NULL) {} //非递归 Node* Find(const K& key) { return _Find(_root,key); } bool Insert(const K& key,const V& value) { return _Insert(_root,key,value); } bool Remove(const K& key) { return _Remove(_root,key); } //递归 bool InOrder() //中序遍历 --> 有序序列 { return _InOrder(_root); cout< _key > key) { cur=cur->_right; } else if(cur->_key < key) { cur=cur->_left; } else { return cur; } return NULL; } bool _Insert(Node *&root,const K& key,const V& value) { if(root == NULL) { root=new Node(key,value); return true; } Node *cur=root; Node *parent=NULL; while(cur) { if(cur->_key < key) { parent=cur; cur=cur->_right; } else if(cur->_key > key) { parent=cur; cur=cur->_left; } else return false; } if(parent->_key < key) { parent->_right=new Node(key,value); parent->_right=parent; } else { parent->_left=new Node(key,value); parent->_left=parent; } return true; } bool _Remove(Node*& root,const K& key ) { if(root == NULL) return false; Node *cur=root; Node *parent=NULL; 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 == NULL)//左为空 { if(parent == NULL) root=cur->_right; else if(parent->_left == cur) parent->_left=cur->_right; else parent->_right=cur->_right; } else if(cur->_right == NULL)//右为空 { if(parent == NULL) root=cur->_left; else if(parent->_left == cur) parent->_left=cur->_left; else parent->_right=cur->_left; } else //左右都不为空 { Node *parent=cur; Node *left=cur->_right;//右子树的最左节点 while(left->_left) { left=left->_left; } cur->_key=left->_key;//替换结点 cur->_value=left->_value; if(parent->_left == left) parent->_left=left->_left; else parent->_right=left->_right; delete left; } } return true; } return false; } //递归 bool _InOrder(Node *root) { if(root == NULL) return false; _InOrder(root->_left); cout< _left<<" "; _InOrder(root->_right); return true; } Node* _FindR(Node *root,const K& key) { if(root == NULL) return NULL; if(root->_key == key) return root; else if(root->_key > key) return _FindR(root->_left,key); else return _FindR(root->_right,key); } bool _InsertR(Node *root,const K& key,const V& value) { if(root == NULL) { root=new Node(key,value); return true; } if(root->_key > key) return _InsertR(root->_left,key,value); else if(root->_key < key) return _InsertR(root->_right,key,value); else return false; } bool _RemoveR(Node *root,const K& key) { if(root == NULL) return false; if(root->_key > key) return _RemoveR(root->_left,key); else if(root->_key < key) return _RemoveR(root->_right,key); else //找到节点 { Node *del=NULL; if(root->_left == NULL) root=root->_right; else if(root->_right == NULL) root=root->_left; else { Node *parent=NULL; Node *left=root; while(left->_left) { parent=left; left=left->_left; } root->_key=left->_key; root->_value=left->_value; del=left; if(parent->_left == left) parent->_left=left->_left; else parent->_right=left->_right; delete del; return true; } } return false; }protected: Node *_root;};
3、总结:
搜索二叉树是一棵排序二叉树,可为空树。它的每一个节点都遵从搜索二叉树的性质。
搜索二叉树的中序遍历后为升序序列;其查找根据key值以及性质进行;其插入需先根据其key值找到插入的节点,随后添加节点,另外其key值唯一;
其删除节点时,需分3种情况:
(1)仅左为空;
(2)仅右为空;
(3)该节点左右皆不为空。
删除该节点,即需 找到 右子树的最左节点 或 左子树的最右节点,作为替换结点。
看完上述内容,你们掌握如何进行搜索二叉树分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
节点
搜索
关键
子树
性质
递归
分析
内容
序列
方法
更多
结点
问题
排序
有序
相同
束手无策
为此
升序
原因
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器搭建费用
华为云桌面与服务器
枣庄软件开发便宜
服务器预算表
服务器自检进不去
安国市委网络安全
qq怎么将消息连接至服务器
设置连接本地数据库
教育网络安全公司
后端文件存储在数据库
大数据云和网络安全
服务器主板硬盘灯长亮
数据库工程师课本
小学生网络安全竞赛题网址
江苏派恩杰网络安全有限责任公司
潮流软件开发过程标准
网络安全周报名2020
街道办网络安全为人民
财务管理专业数据库设计和实现
深圳市网络安全通报平台
杭州快门网络技术有限公
龙口微信小程序软件开发推荐
现在流行的数据库技术
数据库系统的组成四部分
康佳网络技术有限公司
小软件开发学什么软件
mysql 数据库工程师
多功能酒店服务器
麻城住宿软件开发
网络安全行业盈利模式