二叉搜索树 C++代码实现
暂未发现什么bug,如果发现请指出。
#include<iostream> using namespace std; //定义二叉搜索树的结点 struct Node { int data; Node *lc,*rc,*parent; }; //中序遍历二叉搜索树 void show(Node *now) { if(now==NULL) return; show(now->lc); cout<<now->data<<endl; show(now->rc); } //将值为val的结点插入到二叉搜索树中 //?为什么要传指向根结点指针的指针,而不是直接传根结点的指针。因为根结点的指针可能为空,这里需要开辟内存。 Node* insert(Node **rt,int val) { Node *now=*rt;//用now指针在树上移动 Node *par=NULL;//记录now指针的父亲 while(now!=NULL) { par=now; if(val<now->data)//如果val小于当前结点的值说明应该插到左子树中 now=now->lc; else now=now->rc; //否则插入到右子树中 } Node *newnode=new Node;//开辟新结点 newnode->data=val; newnode->lc=newnode->rc=NULL; if(par==NULL)//当这是一棵空树的时候 { newnode->parent=NULL; *rt=newnode;//直接通过指针修改根结点 } else { if(val<par->data) par->lc=newnode; else par->rc=newnode; newnode->parent=par; } return newnode; } //在以now为根结点的树上,寻找值为val的结点 Node* search(Node *now,int val) { while(now!=NULL&&now->data!=val) { if(val<now->data) now=now->lc; else now=now->rc; } return now; } //在以now为根结点的树上,寻找最大、最小值 Node* maximun(Node *now) { while(now->rc!=NULL) { now=now->rc; } return now; } Node* minimun(Node *now) { while(now->lc!=NULL) now=now->lc; return now; } //寻找now结点的前继、后继 //寻找前继:如果now的左子树非空,则返回左子树的最大值结点。否则如果now是父亲的左孩子则不断向上直到now不再是父亲的左孩子,返回父结点。 Node* predecessor(Node *now) { if(now->lc!=NULL) return maximun(now->lc); Node *par=now->parent; while(par!=NULL&&now==par->lc) { now=par; par=par->parent; } return par; } Node* successor(Node *now) { if(now->rc!=NULL) return minimun(now->rc); Node *par=now->parent; while(par!=NULL&&now==par->rc) { now=par; par=par->parent; } return par; } //对于一棵以T为根结点的树,用以v为根结点的子树取代以u为根结点的子树,完成u的父亲与v之间的绑定 void transplant(Node **T,Node *u,Node *v) { if(u->parent==NULL) (*T)=v; else if(u==u->parent->lc) u->parent->lc=v; else if(u==u->parent->rc) u->parent->rc=v; if(v!=NULL) v->parent=u->parent; } //删除给定结点 void erase(Node **T,Node *now) { Node *temp=now; if(now->lc==NULL) { transplant(T,now,now->rc); } else if(now->rc==NULL) { transplant(T,now,now->lc); } else { Node* nextnode=successor(now); if(nextnode!=now->rc) { transplant(T,nextnode,nextnode->rc); nextnode->rc=now->rc; now->rc->parent=nextnode; } transplant(T,now,nextnode); nextnode->lc=now->lc; now->lc->parent=nextnode; } delete temp; } int main() { Node *root=NULL; ) { cout<<"1.插入结点"<<endl; cout<<"2.删除结点"<<endl; cout<<"3.中序遍历"<<endl; cout<<"4.查询"<<endl; cout<<"5.查询根"<<endl; int p; cin>>p; ) { cout<<"输入待插元素值:"<<endl; int t; cin>>t; insert(&root,t); cout<<"插入成功!"<<endl; } ) { cout<<"输入待删元素值:"<<endl; int t; cin>>t; Node *q=search(root,t); if(q==NULL)cout<<"该值不存在!"<<endl; else { erase(&root,q); cout<<"删除成功!"<<endl; } } ) { cout<<"======"<<endl; show(root); cout<<"======"<<endl; } ) { cout<<"输入待查询元素值:"<<endl; int t; cin>>t; Node *q=search(root,t); if(q==NULL) cout<<"该值不存在!"<<endl; else { Node *a=predecessor(q),*b=successor(q); if(a!=NULL) cout<<"前继:"<<a->data<<endl; if(b!=NULL) cout<<"后继:"<<b->data<<endl; } } ) { if(root==NULL) cout<<"根为空!"<<endl; else cout<<"根:"<<root->data<<endl; } } ; }
二叉搜索树 C++代码实现的更多相关文章
- python 二叉搜索树相关代码
class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None class Ope ...
- 基于visual Studio2013解决算法导论之029二叉搜索树
题目 二叉搜索树 解决代码及点评 #include <stdio.h> #include <malloc.h> #include <stdlib.h> ty ...
- 二叉搜索树(Binary Search Tree)--C语言描述(转)
图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总 ...
- 自己动手实现java数据结构(六)二叉搜索树
1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...
- 数据结构 - 二叉搜索树封装 C++
二叉搜索树封装代码 #pragma once #include <iostream> using namespace std; template<class T>class T ...
- 每日一题 - 剑指 Offer 33. 二叉搜索树的后序遍历序列
题目信息 时间: 2019-06-26 题目链接:Leetcode tag:分治算法 递归 难易程度:中等 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 tr ...
- 编程算法 - 二叉搜索树 与 双向链表 代码(C++)
二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...
- 编程算法 - 二叉搜索树(binary search tree) 代码(C)
二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...
- BinarySearchTree(二叉搜索树)原理及C++代码实现
BST是一类用途极广的数据结构.它有如下性质:设x是二叉搜索树内的一个结点.如果y是x左子树中的一个结点,那么y.key<=x.key.如果y是x右子树中的一个结点,那么y.key>=x. ...
随机推荐
- maven私有库配置
私有库的配置 协同开发过程中私有库可以为团队提升很大效率,之前我的私有库一直存在问题导致jar包导入异常.现在在这分享一下私有库配置的几个点,可能因为我们学校比较简陋所以配置的比较简单,欢迎大家补充 ...
- loadrunner录制脚本方式笔记
1.脚本录制的基本原则 充分考虑脚本的执行效率 性能测试脚本关注的是如何模拟用户的真实行为.因此,用于测试的脚本应该接近用户的真正操作.这就要求录制后 的脚本在修改的过程中不要增加过多 ...
- Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’解决方法 + Linux启动/停止/重启Mysql数据库的方法
启动mysql 报错: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/m ...
- openstack Icehouse发布
OpenStack 2014.1 (Icehouse) Release Notes General Upgrade Notes Windows packagers should use pbr 0.8 ...
- 学习mongo系列(四) find().pretty() remove() 查询
一.find() 方法以非结构化的方式来显示所有文档.如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.collection_name.find().pretty ...
- (转) C++中基类和派生类之间的同名函数的重载问题
下面有关派生类与基类中存在同名函数 fn: class A { public: void fn() {} void fn(int a) {} }; class B : public A { publi ...
- Echarts的基本用法
首先需要到导入echatrs.js文件 <script src="dist/echarts.js"></script> 路径配置 require.confi ...
- SPSS数据分析—简单线性回归
和相关分析一样,回归分析也可以描述两个变量间的关系,但二者也有所区别,相关分析可以通过相关系数大小描述变量间的紧密程度,而回归分析更进一步,不仅可以描述变量间的紧密程度,还可以定量的描述当一个变量变化 ...
- banner秒杀
永远显示 未开始/进行中(需要用到两个for循环,第一个我没有想到,诗詹帮我写的) function timeList(){ myTime = new Date().getTime() var ite ...
- UNIX-LINUX编程实践教程->第八章->实例代码注解->写一个简单的shell
一 分析 要实现一个shell,需包含3个步骤 1)读入指令 2)指令解析 3)执行指令 1 从键盘读入指令 从键盘读入指令的几个要点: 1)调用getc函数等待并获取用户键盘输入. 2)每一行命令的 ...