二叉搜索树 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. ...
随机推荐
- Codeforces 749C:Voting(暴力模拟)
http://codeforces.com/problemset/problem/749/C 题意:有n个人投票,分为 D 和 R 两派,从1~n的顺序投票,轮到某人投票的时候,他可以将对方的一个人K ...
- 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...
- R绘图基础
一,布局 R绘图所占的区域,被分成两大部分,一是外围边距,一是绘图区域. 外围边距可使用par()函数中的oma来进行设置.比如oma=c(4,3,2,1),就是指外围边距分别为下边距:4行,左边距3 ...
- Spring 源码学习
spring最核心的理念是IOC,包括AOP也要屈居第二,那么IOC到底是什么呢,四个字,控制反转 一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们 ...
- IIS 7中 ISAPI 错误解决
在本地IIS种发布了一个测试网站,浏览的时候提示 404 错误,无法显示页面,具体错误如下: 解决办法如下: 选择IIS根目录,在右边的功能视图中选择 “ISAPI 和 CGI限制”,双击打开, 把相 ...
- 《BI那点儿事》数据流转换——OLE DB 命令转换
OLE DB命令对数据流中的数据行执行一个OLE DB命令.它针对数据表中的每一行进行更新操作,可以事先将要更新的数据存放在表中.或者针对一个有输入参数的存储过程,可以将这些参数存放在一个数据表中,不 ...
- iOS - Mac OS X 常用快捷键
Mac OS X 常用快捷键 1)快捷键图标: Escape 为 esc 键 无 Eject 键时用电源键代替 Space Bar 为空格键 2)基本快捷键: command + x 剪切文字 com ...
- Hbase之修改表结构
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...
- 浅谈HTTP协议(下)
下面来讲响应消息.响应消息也分为响应起始行.响应头部.CRLF.响应主体. 响应起始行包括协议版本.响应状态码.原因短句.这里的重点就是响应状态码,它一共分为5类,状态码准确的说是一个三位数. 1xx ...
- 浏览器html页面乱码问题分析
直接访问某html文件,浏览器显示编码是正常的,页面通过<meta charset="UTF-8">指定了编码方式,该文件存储编码也是utf8. 通过配置的org.sp ...