c++二叉查找树怎么使用
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容介绍了"c++二叉查找树怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在数据顺序存储
千家信息网最后更新 2025年12月02日c++二叉查找树怎么使用
本篇内容介绍了"c++二叉查找树怎么使用"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
在数据顺序存储时 如果无序我们用顺序查找, 有序时我们用折半查找法,插值查找法,斐波那契查找法。 但是当需要插入跟删除
时就需要用到链式
存储了 这时我们引入二叉排序树(二叉搜索树)。
线索二叉树node->left .data < node.data < node->right.data;
中序遍历时为递增数列 InOrderTraverse;
删除节点时 重点注意下;有4种
1.从node->left 找最大值替换node;
2.从node->right找最小值替换node;
3.将node->right整体移动到node->left最大值的右边;
4.将node->left整体移动到node->right最小值的左边;
不过考虑到树的深度最好采用前两种 这就设计到树的左右节点平衡的问题了AVL树
#include#include using namespace std; typedef struct treenode { int data; struct treenode *left; struct treenode *right; }TREE_NODE;//节点 typedef struct Bstree { TREE_NODE* root; int size; }BSTREE;//二叉树 BSTREE* create_tree() //创建 { BSTREE* tree = new(BSTREE); tree->root = NULL; tree->size = 0; return tree; } TREE_NODE* create_node(int data) //创建节点 { TREE_NODE* node =new(TREE_NODE); node->data = data; node->left = NULL; node->right = NULL; } void insert(TREE_NODE* node, TREE_NODE** root) //插入一个节点到那个位置 { if(NULL == *root) { *root = node; } else { if(node->data > (*root)->data) { insert(node, & (*root)->right); } else { insert(node, &(*root)->left); } } } void PreOrderTraverse(TREE_NODE* root) //先序遍历 { if(root) { cout << root->data < left); PreOrderTraverse(root->right); } } void InOrderTraverse(TREE_NODE* root) //中序遍历 { if(root) { InOrderTraverse(root->left); cout << root->data < right); } } void PostOrderTraverse(TREE_NODE * root) //后序遍历 { if(root) { PostOrderTraverse(root->left); PostOrderTraverse(root->right); cout << root->data < root); (tree->size)++; } TREE_NODE** bstree_find(int data, TREE_NODE** root) //查找DATA 对应的位置 { if(NULL==*root) { return root; } if(data >(*root)->data) { return bstree_find(data,& (*root)->right); } else if(data < (*root)->data) { return bstree_find(data, & (*root)->left); } else { return root; } //下面是非递归查找*root if(NULL==*root) { return root; } TREE_NODE* temp = *root; while(temp && ( temp->data !=data )) { if(data > temp->data) { temp = temp->right; } else if(data < temp->data) { temp = temp->left; } if(temp) { return &temp; } else { return &temp; } }} void del_node(TREE_NODE* node) //删除 该节点 { delete(node); } bool bstree_erase(int data, BSTREE* tree) //树中 插入 传入的是地址 如果想修改 这一地址变量就要 根据地址的地址 修改 { TREE_NODE** node = bstree_find(data, & tree->root); if(*node) { TREE_NODE* temp = *node; if( ((*node)->right==NULL) &&((*node)->left==NULL))//如果为叶子节点 { *node = NULL; del_node(temp); --tree->size; } if(((*node)->right==NULL) &&((*node)->left!=NULL))//node的right为空 { *node = (*node)->left; del_node(temp); --tree->size; } else if(((*node)->right!=NULL) &&((*node)->left==NULL))//node的left为空 { *node = (*node)->right; del_node(temp); --tree->size; } //下面是左右子树都不为空 删除时任一种情况 最好用1 2 种 //node的左右都不为空将left中最大的数顶替已经删除的node if(((*node)->left != NULL) && ((*node)->right != NULL)) { TREE_NODE* s = (*node)->left; while(s->right) { temp=s; s=s->right; } (*node)->data = s->data; if(temp != *node) { temp->righ = s->left; } else { temp->left =s->left;//类似左子树 } del_node(s); --tree->size; } //node的左右都不为空将right中最小的数顶替已经删除的node if(((*node)->left != NULL) && ((*node)->right != NULL)) { TREE_NODE* s = (*node)->right; while(s->left) { temp=s; s=s->left; } (*node)->data = s->data; if(temp != *node) { temp->left = s->right; } else { temp->right =s->right;//类似右子树 } del_node(s); --tree->size; } //node的左右都不为空,直接将右边整体移动到左边最大值下面 if(((*node)->left != NULL) && ((*node)->right != NULL)) { TREE_NODE* s = (*node)->left; while(s->right) { s=s->right; } s->right = (*node)->right; *node = (*node)->left; del_node(s); --tree->size; } //node的左右都不为空,直接将左边边整体移动到右边最小值下面 if(((*node)->left != NULL) && ((*node)->right != NULL)) { TREE_NODE* s = (*node)->right; while(s->left) { s=s->left; } s->left = (*node)->left; *node = (*node)->right; del_node(s); --tree->size; } return true; } return false; } void bstree_updata(BSTREE* tree,int old,int now) //新旧替换更新 { while(bstree_erase(old,tree)) { bstree_insert(now,tree); } } void clear_node(TREE_NODE** root) //清楚节点 { if(*root) { clear_node(&(*root)->left); clear_node(&(*root)->right); del_node(*root); *root = NULL; } } void clear_tree(BSTREE* tree) //clear_tree { clear_node(&tree->root); tree->size = 0; } void bstree_destroy(BSTREE* tree) //bstree_destroy { clear_tree(tree); delete(tree); } int bstree_size(BSTREE* tree) //大小 { return tree->size; } int bstree_deep(TREE_NODE* root) //深度DEPTH { if(root) { int Hleft = bstree_deep(root->left); int Hright = bstree_deep(root->right); return Hleft>Hright ? Hleft+1 : Hright+1; } return 0; } void printNodeByLevel(TREE_NODE* root) //层序遍历 { if(root ==NULL) { return; } vector vec; vec.push_back(root); int cur=0; int last =1; while(cur data<<" "; if(vec[cur]->left != NULL) { vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL) { vec.push_back(vec[cur]->right); } ++cur; } cout< vec; vec.push_back(root); int cur=0; while(cur data<<" "; if(vec[cur]->left != NULL) { vec.push_back(vec[cur]->left); } if(vec[cur]->right != NULL) { vec.push_back(vec[cur]->right); } ++cur; } cout< root); cout << "the first print:\n"; PreOrderTraverse(tree->root); cout << "the middle print:\n"; InOrderTraverse(tree->root); cout << "the endl print:\n"; PostOrderTraverse(tree->root); cout<<"the tree deep:\n"; cout< root)< root); cout << "destroy the tree:\n"; bstree_destroy(tree); return 0; }
"c++二叉查找树怎么使用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
节点
最大
最小
地址
整体
移动
右边
最大值
子树
c++
位置
内容
情况
更多
最好
深度
知识
顺序
存储
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器怎么扫鸡
基于框架软件开发实训
江苏南京互联网服务器虚拟主机
鸟数据库
无线网络安全性是哪种显示
提现用公共网络安全吗
服务器安全性报告
网络安全产品运营简历
网络安全 工作计划
思科jabber设置服务器
连云港海航软件开发业务流程
智能化软件开发不二之选
杨浦区网络技术开发行业标准
网络安全中数据治理的成效
广州加固服务器
做网络安全的男生
mc大型服务器小豆服
数据库视图管理实验原理
新加坡服务器 备案吗
中关村互联网科技集团培训的吗
深圳软件开发培训骗局
数据库修改后天密码
中国台湾oa软件开发视频
网络技术对个人通讯的影响
photon服务器常用吗
代理服务器 扫描
大型软件开发流程
时代网络技术分类代理商
石嘴山网络技术销售价格
在西安兼职的软件开发