BinarySearchTree

本文介绍了一种二叉搜索树的实现方式,包括插入、删除、查找等基本操作,并提供了完整的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.zhuyu_deng.test;


public class BinarySearchTree<T extends Comparable<? super T>>
{
	// 结点
	private static class BinaryNode<T>
	{
		T element;
		BinaryNode<T> left;
		BinaryNode<T> right;

		BinaryNode(final T x, final BinaryNode<T> lt, final BinaryNode<T> rt)
		{
			element = x;
			left = lt;
			right = rt;
		}
	}

	// 根
	private BinaryNode<T> root;

	public BinarySearchTree()
	{
		root = null;
	}

	//
	public void makeEmpty()
	{
		root = null;
	}

	public boolean isEmpty()
	{
		return root == null;
	}

	public boolean contains(final T x)
	{
		return contains(x, root);
	}

	public void printTree()
	{
		if (isEmpty())
			System.out.println("Empty tree");
		else
			printTree(root);
	}

	public void insert(final T x)
	{
		root = insert(x, root);
	}
	
//	public void insert(final T x)
//	{
//		BinaryNode<T> p = null;  // y始终指向x的父亲
//		BinaryNode<T> cur = root;
//		
//		while (cur != null)
//		{
//			p = cur;
//			if (x.compareTo(cur.element) < 0)  // key[x] < key[cur], left , right
//				cur = cur.left;
//			else
//				cur = cur.right;
//		}
//		
//		if (root == null)  // 空树,设置根结点
//		{
//			root = new BinaryNode<T>(x, null, null);
//		}
//		else
//		{
//	rst < 0, rst > 0, rst = 0; 分这3种情况讨论,可以避免插入重复的结点。
//			if (x.compareTo(p.element) < 0)
//				p.left = new BinaryNode<T>(x, null, null);
//			else if (x.compareTo(p.element) > 0)
//
//				p.right = new BinaryNode<T>(x, null, null);
//			else
//				;
//				
//		}
//	}

	public void remove(final T x)
	{
		root = remove(x, root);
	}

	private boolean contains(final T x, final BinaryNode<T> t)
	{
		if (t == null)
			return false;
		final int rst = x.compareTo(t.element);
		if (rst < 0)
			return contains(x, t.left);
		else if (rst > 0)
			return contains(x, t.right);
		else
			;
		return true;
	}

	// find min

	 private BinaryNode<T> findMin( BinaryNode<T> t )
	 {
	     if( t == null )
	         return null;
	     else if( t.left == null )
	         return t;
	     return findMin( t.left );
	 }
	
	// find max
	@SuppressWarnings("unused")
	private BinaryNode<T> findMax(BinaryNode<T> t)
	{
		if (t != null)
			while (t.right != null)
				t = t.right;
		return t;
	}

	private BinaryNode<T> remove(final T x, BinaryNode<T> t)
	{
		if (t == null)
			return t; // Item not found; do nothing
		final int rst = x.compareTo(t.element);
		if (rst < 0)
			t.left = remove(x, t.left);
		else if (rst > 0)
			t.right = remove(x, t.right);
		else if (t.left != null && t.right != null)
		{
			t.element = findMin(t.right).element;
			t.right = remove(t.element, t.right);
		} else
		{
			t = (t.left != null) ? t.left : t.right;
		}
		return t;
	}
	
// 插入一个结点的recursive version
	private BinaryNode<T> insert(final T x, final BinaryNode<T> t)
	{
		if (t == null)
			return new BinaryNode<T>(x, null, null); // 作为根结点
		
		final int rst = x.compareTo(t.element);
		if (rst < 0)
			t.left = insert(x, t.left);
		else if (rst > 0)
			t.right = insert(x, t.right);
		else  // 这种情况对应的是相当,即原来二叉排序树中有这个结点不插入。
			;
		return t;  // t依然是根
	}
	


	
	private void printTree(final BinaryNode<T> t)
	{
		if (t != null)
		{
			printTree(t.left);
			System.out.println(t.element);
			printTree(t.right);
		}
	}

	
	
	@SuppressWarnings("unused")
	private int height(final BinaryNode<T> t)
	{
		if (t == null)
			return -1;
		else
			return 1 + Math.max(height(t.left), height(t.right));
	}
}

OPCUA(OPC统一架构)是一种开放标准通信协议,用于工业自动化和其他领域的设备和系统之间的数据交换。它建立在 OPC Foundation 的基础之上,旨在替代早期的 OPC DA(OPC 数据访问),提供更安全、更高效且平台无关的通信方式。本压缩包“OPCUA与OPCServer通讯测试客户端程序.zip”包含了实现OPCUA客户端与OPCServer服务端通讯测试的相关资源。 1. OPCUA协议:OPCUA的核心特性在于它的服务导向架构,包括了数据访问、历史数据访问、报警和事件、方法调用等服务。它使用TCP/IP作为传输层,并支持SSL/TLS加密,确保数据传输的安全性。OPCUA还引入了发布/订阅模型,允许实时数据流的高效传输。 2. OPCServer:OPCServer是OPCUA架构中的一个组件,通常由设备制造商或软件供应商提供,它将特定设备或系统的数据暴露给OPCUA客户端,使得多个应用程序可以共享这些数据。例如,KepServer是OPCServer的一种,它可以连接到各种PLC(可编程逻辑控制器)、SCADA系统和其他工业设备。 3. OPCUA客户端:客户端是使用OPCUA协议来访问OPCServer服务的应用程序。在这个压缩包中,提供的客户端程序应该能够发现OPCServer,建立安全连接,浏览OPCServer提供的节点结构,读取和写入数据,以及订阅变化。 4. OPCUA访问KepServer:KepServer是OPC基金会认证的服务器,支持OPCUA协议。通过OPCUA客户端,你可以与KepServer进行交互,获取或控制连接到KepServer的设备或系统的数据。这在设备监控、数据采集和自动化应用中非常常见。 5. 测试过程:通讯测试通常涉及以下步骤: - 安装和配置OPCServer(如KepServer)。 - 运行客户端程序,配置OPCServer的连接参数,包括地址、端口、认证信息等。 - 使用客户端发现OPCServer上的可用服务和数据节点。 - 测试读写操作,验证数据传输的正确性和实时性。 - 可能还包括性能测试,检查数据刷新速率和网络负载。 6. 遵循OPCUA标准:OPCUA提供了丰富的API和SDK,允许开发者创建符合标准的客户端和服务器应用。在实现OPCUA通讯时,必须遵循OPCUA的信息模型和接口定义,确保与其他OPCUA兼容设备的互操作性。 7. 安全性考虑:OPCUA内置了安全机制,如身份验证、授权和加密。客户端和服务器间的通信应配置适当的安全策略,以防止未授权访问和数据泄露。 通过这个压缩包,用户可以学习和实践如何建立和测试OPCUA客户端与OPCServer之间的通讯,这对于理解和开发基于OPCUA的工业自动化解决方案至关重要。同时,对于那些需要集成不同设备或系统的项目,了解并掌握OPCUA技术是非常有价值的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值