linux下练习 c++ 有序二叉树

简介: #include using namespace std; typedef int T; class bst//有序的二叉查找树 { struct Node { T data; Node * L; Node *...
#include <iostream>
using namespace std;
typedef int T;
class bst//有序的二叉查找树
{
	struct Node
	{
		T data;
		Node * L;
		Node * R;
		Node(const T&d):data(d),L(),R(){}//将L或R初始化为0
		Node(const T&d,Node * l,Node * r):data(d),L(l),R(r){}
	};
	typedef Node* tree;
	Node * root;//根结点
	int n;//记录节点个数
public:
	bst():root(),n(){}
	void insert(tree& t,Node* p)//插入数据
	{
		if(t==NULL) t=p;
		else if(p->data<t->data) insert(t->L,p);
		else insert(t->R,p);
	}
	void insert(const T& d)
	{
		insert(root,new Node(d));
		++n;
	}
	tree& find(tree& t,const T& d)//查找,&代表指针本身
	{
		if(t==NULL) return t;//返回tree类型的
		else if(d==t->data) return t;
		else if(d<t->data) return find(t->L,d);
		else return find(t->R,d);
	}
	tree& find(const T& d)
	{
		return find(root,d);
	}
	void travel(tree t) const//遍历
	{
		if(t!=NULL)
		{
			travel(t->L);
			cout<<t->data<<" ";
			travel(t->R);
		}
	}
	void travel()
	{
		travel(root);
		cout<<endl;
	}
	bool empty()const//是否为空
	{
		return root==NULL;
	}
	bool remove(const T& d)//删除数据节点
	{
		tree& t=find(d);//引用,原来的地址
		if(t==NULL) return false;
		Node* p=t;
		if(t->L !=NULL) insert(t->R,t->L);//左子树插入到右子树中去
		t=t->R;//t指向右子树
		delete p;//删除结点空间
		--n;
		return true;
	}
	int size()const {return n;}
	void update(const T& olddata,const T& newdata)//修改数据
	{
		if(remove(olddata)) insert(newdata);//删除旧的,插入新的
	}
	const T& rdata()const
	{
		if(!root) throw "空";
		return root->data;
	}
	void clear(tree& t)//清空,释放内存
	{
		if(t!=NULL)
		{
			clear(t->L);
			clear(t->R);
			delete t;
			t=NULL;
			cout<<"内存释放完成!\n";
			n=0;
		}
	}
	void clear()
	{
		clear(root);
	}
	int height(tree t)//高度
	{
		if(t==NULL) return 0;
		int lh=height(t->L);
		int rh=height(t->R);
		return 1+(lh>rh?lh:rh);
	}
	int height()
	{
		return height(root);
	}
};

int main()
{
	bst b;
	b.insert(4);//插入
	b.insert(5);
	b.insert(-23);
	b.insert(24);
	b.insert(77);
	b.insert(20);
	b.update(20,28);//20修改为28
	b.remove(4);//删除4的节点
	b.travel();//遍历一下
	cout<<b.rdata()<<endl;
	return 0;
}

g++ -o tree.out tree.cpp

./tree.out

 

相关文章
|
1月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
91 0
|
1月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
86 1
Linux C/C++之IO多路复用(aio)
|
1月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
37 0
|
1月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
301 3
|
1月前
|
资源调度 Linux 调度
Linux C/C++之线程基础
这篇文章详细介绍了Linux下C/C++线程的基本概念、创建和管理线程的方法,以及线程同步的各种机制,并通过实例代码展示了线程同步技术的应用。
29 0
Linux C/C++之线程基础
|
1月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
25 0
Linux C/C++之IO多路复用(poll,epoll)
|
1月前
|
网络协议 Linux 网络性能优化
Linux C/C++之TCP / UDP通信
这篇文章详细介绍了Linux下C/C++语言实现TCP和UDP通信的方法,包括网络基础、通信模型、编程示例以及TCP和UDP的优缺点比较。
37 0
Linux C/C++之TCP / UDP通信
|
1月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
32 0
Linux c/c++之IPC进程间通信
|
1月前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
29 0
Linux c/c++进程间通信(1)
|
1月前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
37 0
Linux c/c++之进程的创建
下一篇
无影云桌面