数据结构和算法(查找算法[ 二分、插值 ]、哈希表构成、普通二叉树操作、线索化和遍历[ 前、中、后 ] 序)

2023-11-08

常用查找算法:
  • 顺序(线性)查找
  • 二分查找/折半查找
  • 插值查找
顺序查找:

按照顺序,遍历数组,比对数字,如果找到,返回下标,由于比较简单,不再介绍

二分查找:

二分查找思路分析:
在这里插入图片描述
需要查找的数组必须是有序的,否则查找没有意义

二分查找代码实现:
public class BinarySearch {
	public static void main(String[] args) {
		int[] arr = new int[] { 1, 8, 10, 60, 89, 1000, 1234 };
		int i = binarySearch(arr, 0, arr.length - 1, 60);
		System.out.println(i);

	}
	
	//普通二分查找
	public static int binarySearch(int[] arr, int left, int right, int findValue) {
		// 递归调用出口
		if (left > right) {
			return -1;
		}
		int mid = (left + right) / 2;
		if (arr[mid] == findValue) {
			return mid;
		} else if (arr[mid] > findValue) {
			return binarySearch(arr, left, mid - 1, findValue);
		} else if (arr[mid] < findValue) {
			return binarySearch(arr, mid + 1, right, findValue);
		}

		return -1;

	}

一般二分查找只能找到一个索引,如果符合条件的数据有多个,那么就只能返回第一个符合条件数据的索引,如果要返回多个索引,需要继续查找:
二分查找实现(多个查询):

	public static int[] binarySearch2(int[] arr, int left, int right, int findValue) {

		if (left > right) {
			return result;
		}
		int mid = (left + right) / 2;
		if (arr[mid] == findValue) {
			result[index++] = mid;
			binarySearch2(arr, mid + 1, right, findValue);
			binarySearch2(arr, left, mid -1, findValue);
			return result;
			
			
		} else if (arr[mid] > findValue) {
			return binarySearch2(arr, left, mid - 1, findValue);
		} else if (arr[mid] < findValue) {
			return binarySearch2(arr, mid + 1, right, findValue);
		}
		return result;

	}
插值查找:

插值查找思路分析:
在这里插入图片描述
插值查找适用于平均分布的数据
插值查找是二分查找对平均分布数据的优化
只要将mid值得求法改成公式即可:

int mid = left + (findValue - arr[left]) / (arr[right] - arr[left]) * right;

插值查找注意事项:
在这里插入图片描述

哈希表:

哈希表介绍:
在这里插入图片描述
百度百科的图例:
在这里插入图片描述

树结构(二叉树):

在这里插入图片描述
二叉树的遍历
在这里插入图片描述

遍历思路分析:
在这里插入图片描述

二叉树遍历代码:
public class MyTree {
	public static void main(String[] args) {
		Tree tree = new Tree();
		tree.add(new TreeNode(1, "1"));
		tree.add(new TreeNode(2, "2"));
		tree.add(new TreeNode(3, "3"));
		tree.add(new TreeNode(4, "4"));
		tree.Hlist(tree.rootNode);
	}
}

//管理二叉树的类
class Tree {
	public TreeNode rootNode;

	public void add(TreeNode node) {
		if (rootNode == null) {
			rootNode = node;
			return;
		}
		TreeNode temp = rootNode;
		while (true) {
			if(temp == null) {
				break;
			}
			if (temp.id < node.id) {
				if (temp.rightChild == null) {
					temp.rightChild = node;
					break;
				} else {
					temp = temp.rightChild;
				}
			} else if (temp.id >= node.id) {
				if (temp.leftChild == null) {
					temp.leftChild = node;
					break;
				} else {
					temp = temp.leftChild;
				}
			}
		}

	}

	public void Qlist(TreeNode node) {
		if (node == null) {
			System.out.println("子树为空");
			return;
		}
		System.out.println(node);
		
		System.out.println("左子树:->");
		Qlist(node.leftChild);
		
		System.out.println("右子树:->");
		Qlist(node.rightChild);
		
		System.out.println("退回->");

	}
	
	public void Zlist(TreeNode node) {
		if (node == null) {
			System.out.println("子树为空");
			return;
		}
		
		System.out.println("左子树:->");
		Zlist(node.leftChild);
		
		System.out.println(node);
		
		System.out.println("右子树:->");
		Zlist(node.rightChild);
		
		System.out.println("退回->");

	}
	
	
	public void Hlist(TreeNode node) {
		if (node == null) {
			System.out.println("子树为空");
			return;
		}
		
		System.out.println("左子树:->");
		Hlist(node.leftChild);
		
		System.out.println("右子树:->");
		Hlist(node.rightChild);
		
		System.out.println(node);
		
		System.out.println("退回->");

	}
}

class TreeNode {
	public int id;
	public String name;
	public TreeNode rightChild;
	public TreeNode leftChild;

	public TreeNode(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "TreeNode [id=" + id + ", name=" + name + "]";
	}

}
二叉树删除节点:

在这里插入图片描述
步骤(遍历比对):
在这里插入图片描述
遍历判断效率低,应该根据待删除的编号找到节点的父节点后将其删除:

	//调用时传入头节点,和待删除的节点编号
	public void del(TreeNode node, int id) {
		if (node.rightChild == null && node.leftChild == null) {
			System.out.println("没有找到");
			return;
		}
		if(node.id == id) {
			rootNode = null;
		}
		if (node.id < id) {
			if (node.rightChild != null) {
				if (node.rightChild.id == id) {
					node.rightChild = null;
					return;
				} else {
					del(node.rightChild, id);
				}
			}
		}
		if (node.id > id) {
			if (node.leftChild != null) {
				if (node.leftChild.id == id) {
					node.leftChild = null;
					return;
				} else {
					del(node.leftChild, id);
				}
			}
		}

	}
顺序存储二叉树:

在这里插入图片描述
在这里插入图片描述

顺序二叉树遍历:
package tree;

public class OrderTree {
	public static void main(String[] args) {
		//定义二叉树
		int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		Zlist(arr, 0, 0, arr.length - 1);

	}

	// 前序
	public static void Qlist(int[] arr, int current, int begin, int end) {

		if (arr == null || arr.length == 0) {
			return;
		}

			if (current < begin || current > end) {
				return;
			}

		System.out.print(arr[current] + " ");

		Qlist(arr, current * 2 + 1, begin, end);

		Qlist(arr, current * 2 + 2, begin, end);

	}

	public static void Zlist(int[] arr, int current, int begin, int end) {
		
		if (arr == null || arr.length == 0) {
			return;
		}

		if (current < begin || current > end) {
			return;
		}

		Zlist(arr, current * 2 + 1, begin, end);

		System.out.print(arr[current] + " ");

		Zlist(arr, current * 2 + 2, begin, end);

	}

	public static void Hlist(int[] arr, int current, int begin, int end) {
		
		if (arr == null || arr.length == 0) {
			return;
		}

		if (current < begin || current > end) {
			return;
		}

		Hlist(arr, current * 2 + 1, begin, end);

		Hlist(arr, current * 2 + 2, begin, end);

		System.out.print(arr[current] + " ");

	}
}

线索二叉树:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200401185307470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTYzMDc2,size_16,color_FFFFFF,t_70)

在这里插入图片描述
如上图,我们需要右一个指针指向遍历的前一个结点才可以构建线索二叉树(在原二叉树的基础上)

实现代码:

结点结构:
class TreeNode2 {
	public int id;
	public String name;
	public TreeNode2 right;
	public TreeNode2 left;
	// leftType == 0表示指向的是左子树(默认),如果1则表示指向前驱节点
	// 如果rightType ==0表示指向是右子树(默认),如果1表示指向后继节点
	
	//用于遍历
	public int leftType;
	public int rightType;

	public TreeNode2(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "TreeNode2 [id=" + id + ", name=" + name + "]";
	}

}

中序线索化和遍历:
	public TreeNode2 rootNode;
	public TreeNode2 preNode = null;
	/**
	 * 中序线索化,传入头节点
	 * 
	 * @param node 需要线索化的节点
	 */
	public void ZthreadNodes(TreeNode2 node) {

		if (node == null) {
			return;
		}
		// 线索化左子树
		if (node.leftType != 1)
			ZthreadNodes(node.left);
///

		// node的值依次为[8,3,10,1,14,6]
		// preNode的值依次为[null,8,3,10,1,14]

		// 线索化当前节点
		// 处理前驱
		if (node.left == null) {
			// 当前结点的左指针指向前驱节点
			node.left = preNode;
			node.leftType = 1;
		}

		// 处理后继结点
		// 如上述分析preNode的值可能为null,需要判断
		if (preNode != null && preNode.right == null) {
			// 前驱结点的右指针指向当前结点
			preNode.right = node;
			preNode.rightType = 1;

		}

		// 每处理一个结点后,让当前结点为下一个结点的前驱结点
		preNode = node;
//
		// 线索化右子树
		if (node.rightType != 1)
			ZthreadNodes(node.right);
	}

	//遍历方法
	public void Zlist(TreeNode2 node) {
		while (node != null) {
			// 找到最左边的结点
			while (node.leftType == 0) {
				node = node.left;
			}
			// 输出
			System.out.println(node);
			
			//开始向后继结点遍历
			while (node.rightType == 1) {
				node = node.right;
				System.out.println(node);
			}
			// 替换这个遍历的结点
			node = node.right;
		}

	}

前序线索化和遍历
	public TreeNode2 rootNode;
	public TreeNode2 preNode = null;
	public void QthreadNodes(TreeNode2 node) {
		if (node == null) {
			return;
		}

		if (node.left == null) {
			node.left = preNode;
			node.leftType = 1;
		}
		if (preNode != null && preNode.right == null) {
			preNode.right = node;
			preNode.rightType = 1;
		}

		preNode = node;

		if (node.leftType != 1)
			QthreadNodes(node.left);
		if (node.rightType != 1)
			QthreadNodes(node.right);
	}
	//遍历
	public void Qlist(TreeNode2 node) {
		 while(node!=null) {
			 while(node.leftType == 0) {
				 System.out.println(node);
				 node = node.left;
			 }
			 System.out.println(node);
			 node = node.right;
		 }
	}
后序线索化和遍历(结点增加父结点引用)

由于后序遍历比较难,附上完整代码:
一定要在构造结点的时候为父节点赋值!!
构建的树:
在这里插入图片描述

public class ThreadTree {

	public static void main(String[] args) {
		//创建结点
		TreeNode2 node1 = new TreeNode2(1, "");
		TreeNode2 node3 = new TreeNode2(3, "");
		TreeNode2 node6 = new TreeNode2(6, "");
		TreeNode2 node8 = new TreeNode2(8, "");
		TreeNode2 node10 = new TreeNode2(10, "");
		TreeNode2 node14 = new TreeNode2(14, "");
		
		node1.right = node6;
		node3.right = node10;
		node1.left = node3;
		node3.left = node8;
		node6.left = node14;
		
		//这一步很重要,没有这一步则遍历失败!!!
		node3.parentNode = node1;
		node6.parentNode = node1;
		node8.parentNode = node3;
		node10.parentNode = node3;
		node14.parentNode = node6;
		/
		
		Tree2 tree2 = new Tree2();
		tree2.HthreadNodes(node1);
		tree2.Hlist(node1);

	}
}

class Tree2 {
	public TreeNode2 rootNode;
	public TreeNode2 preNode = null;
	
	//后序线索化
	public void HthreadNodes(TreeNode2 node) {
		if (node == null) {
			return;
		}
		if (node.leftType != 1)
			HthreadNodes(node.left);
		if (node.rightType != 1)
			HthreadNodes(node.right);
		if (node.left == null) {
			node.left = preNode;
			node.leftType = 1;
		}
		if (preNode != null && preNode.right == null) {
			preNode.right = node;
			preNode.rightType = 1;
		}
		preNode = node;

	}
	
	//后续遍历,方法中不会初始化parentNode结点,请在调用前,手动初始化parentNode结点
	public void Hlist(TreeNode2 node) {
		if (node == null) {
			return;
		}
		// 先找到就开始遍历的结点,也就是最左边的结点(线索化之前原来树的最左边)
		//因为后序遍历就是从这里开始的
		// 迭代左指针,要过滤掉前驱的类型
		while (node != null && node.leftType == 0) {
			node = node.left;
		}
		while(node!=null) {
			//如果有后继结点,就可以顺着后继结点遍历了
			if(node.rightType == 1) {
				System.out.println(node);
				preNode = node;
				//记录上一个结点,向后继移动
				node = node.right;
			}else {
				//如果上次处理的结点时当前结点的右节点
				//因为后序的遍历顺序为左 -> 右 ->当前结点
				//所以可以处理当前结点了
				if(node.right == preNode) {
					System.out.println(node);
					
					//在后序遍历中,根节点时最后访问到的,如果是根节点
					//遍历结束
					if(node == rootNode) {
						return;
					}
					
					preNode = node;
					//回退到上一次结点
					node = node.parentNode;
					
				}else {
					//既没有后继结点,右边的结点也不是上次处理的结点
					node = node.right;
					while(node!=null&& node.leftType == 0) {
						node = node.left;
					}
				}
			}
		}

	}
}

//结点结构
class TreeNode2 {
	public int id;
	public String name;
	public TreeNode2 right;
	public TreeNode2 left;
	// leftType == 0表示指向的是左子树(默认),如果1则表示指向前驱节点
	// 如果rightType ==0表示指向是右子树(默认),如果1表示指向后继节点

	// 用于后续遍历
	public TreeNode2 parentNode;
	// 用于遍历
	public int leftType;
	public int rightType;

	public TreeNode2(int id, String name) {
		this.id = id;
		this.name = name;
	}

	@Override
	public String toString() {
		return "TreeNode2 [id=" + id + ", name=" + name + "]";
	}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构和算法(查找算法[ 二分、插值 ]、哈希表构成、普通二叉树操作、线索化和遍历[ 前、中、后 ] 序) 的相关文章

  • 我可以为 Spring Boot 应用程序创建多个入口点吗?

    In 春季启动 需要指定一个主类 它是应用程序的入口点 通常 这是一个具有标准 main 方法的简单类 如下所示 SpringBootApplication public class MySpringApplication public s
  • Java:BufferedReader readLine() 中的 IOEXception 有何用途?

    我可以使用 try catch 循环 修复 以下异常 但我无法理解原因 为什么 in readLine 部分会不断引发IOExceptions 抛出此类异常的真正目的是什么 目标可能不仅仅是更多副作用 代码和 IOException jav
  • 如何解析比 Java 中 NumberFormat 更严格的数字?

    我正在验证表单中的用户输入 我解析输入NumberFormat http docs oracle com javase 7 docs api java text NumberFormat html 但它是邪恶的 几乎允许任何事情 有没有办法
  • 使用Optional作为类中的属性是一个好习惯吗? [复制]

    这个问题在这里已经有答案了 我读过一些关于目的的内容Optional 不幸的是我不记得在哪里 在Java 8中 我很惊讶作者没有提到使用Optional作为类中的属性 由于我在课堂上经常使用选项 我想知道这是否是一个好的做法 或者我可以更好
  • com.google.gwt.dev.jjs.InternalCompilerException:访问期间出现意外错误

    我在使用版本 2 6 0 编译 gwt 应用程序时遇到以下错误 最初我用 gwt 版本 2 6 1 的 maven 编译它 然后尝试通过版本 2 6 0 的 eclipse 编译它 跟版本兼容有关系吗 com google gwt dev
  • UiBinder 中的 gwt 按钮

    我需要创建一个按钮 所以它是一个带有图像的按钮 gwt with UiBinder 但我不确定如何进行 这是我的ui xml code
  • 指定自定义应用程序上下文

    我们正在将一些数据服务从使用 jersey spring 的 Jersey 1 x 迁移到使用 jersey spring3 的 Jersey 2 x 我们有一些继承自 JerseyTest 的测试类 其中一些类使用 web xml 文件中
  • 找不到模块:javafx.controls

    我已经下载了JavaFX SDK 解压它并设置PATH TO FX系统变量 如下本说明 https openjfx io openjfx docs install javafx 我使用了以下代码示例 import javafx applic
  • Maven:缺少工件 org.springframework:spring:jar:4.2.6

    我在 SpringToolSuite 中有一个动态 Web 项目 它被转换为 Maven 项目 我遇到问题 缺少工件 org springframework spring jar 4 2 6 我已经尝试清理 重建和运行该项目 它给 读取文件
  • Apache POI 的 ProGuard 设置

    我正在构建一个使用 Apache POI 库的应用程序 当我调试应用程序 在不运行 Proguard 的情况下编译它 时 一切都运行良好 但是在导出 APK 后 当我运行应用程序并打开 Excel 文件时 出现以下异常 RuntimeExc
  • 用dagger 2查看依赖注入

    我有一个自定义视图扩展TextView 我应该在哪里调用我的组件来注入视图 component inject customTextView 因此 我发现我需要在自定义视图的构造函数中添加注入 在所有视图中 或者使一个调用另一个 Exampl
  • 如何告诉 Java SAX 解析器忽略无效字符引用?

    当尝试使用字符引用解析不正确的 XML 时 例如 x1 Java 的 SAX 解析器因致命错误而惨死 例如 org xml sax SAXParseException Character reference x1 is an invalid
  • 将 Class 对象转换为字节

    如果我有一个Class http java sun com j2se 1 5 0 docs api java lang Class html在运行时实例 我可以获得它的 byte 表示形式吗 我感兴趣的字节将在类文件格式 http java
  • 使用JPanel绘制直线并获取点坐标

    我现在完全不知所措 我没有太多用 Java 构建 GUI 我一直在阅读有关 swing 和 JPanel 的所有内容 我认为我想做的事情是可能的 我只是还没有弄清楚how 我正在尝试构建一个 GUI 您可以在其中在某个绘图区域内绘制直线 我
  • Spring @Configuration如何缓存对bean的引用

    使用基于 Java 的配置时 Spring 如何防止再次调用 bar 我想知道编译时注释处理或通过代理方法 Configuration public class AppConfig Bean public Foo foo return ne
  • 使用 colt java lib 时出现“矩阵太大”异常

    我正在使用 cern colt matrix lib 进行稀疏矩阵计算 但似乎我一直遇到此错误 线程 main 中的异常 java lang IllegalArgumentException 矩阵太大 我认为这是因为构造函数在 nrows
  • Jersey bean 验证 ParameterNameProvider

    我正在阅读关于泽西岛的文档Bean验证 https jersey java net documentation latest bean validation html The ParameterNameProvider示例显示如何定义方法的
  • bean 中的 Spring JavaConfig 属性未设置?

    我正在考虑将 Spring JavaConfig 与一些属性文件一起使用 但 bean 中的属性未设置 bean 中的属性未设置 这是我的网络配置 Configuration EnableWebMvc PropertySource valu
  • LinkedBlockingQueue 抛出 InterruptedException

    我有这段代码 ALinkedBlockingQueue应该只抛出一个Exception如果在等待添加到队列时被中断 但这个队列是无限的 所以它应该尽快添加 为什么我的关闭方法会抛出一个InterruptedException private
  • 如何使用 JRE 部署 JavaFX 11 桌面应用程序

    我有一个 JavaFX JDK 8 桌面业务应用程序 它使用 Java Web Start 进行部署 用户安装了 Java 8 只需访问 URL 我的 AWS Linux 服务器上的公共 URL 即可下载 启动应用程序 使用 Web Sta

随机推荐

  • 湖南文旅数据中心:湖南文旅数据早知道(9月10日)

    湖南文旅数据早知道 9月10日 星期四 省内文旅要闻 昆明文旅推介会在长沙举行 坚持公交优先 湖南122个县市区全面实现交通一卡通互联互通 湖南雪峰启动消费扶贫 文旅产品引领乡村振兴 国内文旅要闻 国内旅游宣传推广典型案例名单发布 中秋国庆
  • Python3中 pyecharts.charts库可视化词云图--《你的答案》的歌词!

    Python3中 pyecharts charts库可视化词云图 你的答案 的歌词 可视化歌曲 你的答案 的歌词 词频自己设计 Project filename PythonDemo WordCount IDE PyCharm Author
  • js判断数组中是否存在某个属性或者对象

    骑士李四记录 场景一 对数组去重 1 判断是否存在字段 可以对数组去重 var arr 1 2 3 4 arr indexOf 3 2 arr indexOf 5 1 应用 去重 var list for let str of arr if
  • 算法岗面试题.收集

    收集一下算法岗面试题 后续将对问题进行自己的解答 蔚来感知算法岗面试题 1 用C 手写NMS 2 从模型和数据的角度分别说明如何解决梯度爆炸的问题 3 Faster R CNN的流程 两阶段主要解决了什么问题 4 YOLO中是怎么解决正负样
  • 解决:在自动化测试中定位到新打开的窗口的元素问题

    原始代码 time sleep 3 self driver find element by id TANGRAM PSP 10 footerULoginBtn click time sleep 2 log info 点击qq账号登陆 sel
  • 数组实现顺序二叉树的前序遍历,中序遍历,后序遍历

    顺序二叉树的满足条件 1 一般指完全二叉树 2 第n个元素的左子树为2 n 1 3 第n个元素的右子树为2 n 2 4 第n个子树的父节点为 n 1 2 注意 n为数组下标所以是从0开始 代码实现 package com yg tree a
  • js的内容

    1 JS的背景 W3C将网页的标准分成了三部分 HTML 页面的结构 CSS 页面的样式 JavaScript 页面的行为 JavaScript JS 发展背景 创建JavaScript的初衷 JavaScript最开始由网景公司创建的 参
  • 基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 无线传感器网络 Wireless Sens
  • 最详细的ECLIPSE Android SDK下载安装及配置教程

    最近Neo突发神经 想要将学过的一些计算机视觉 机器学习中的算法都放到移动设备上去跑跑 因为移动开发是大势所趋嘛 希望能够通过这样一个实践的过程 找到一些新的灵感 该不会是为了赚钱吧 我自己目前也有一些idea 然后也希望以后能够进行计算机
  • linux看剩余电量命令,Linux终端如何检查笔记本电脑电池的状态和电量

    在Linux的终端检查笔记本电脑电池的状态和电量 通过三种方法从命令行找到笔记本电脑的电池状态 方法1 使用 Upower 命令 大多数Linux发行版中都预装了Upower命令 要使用Upower显示电池状态 请打开终端并运行 upowe
  • vue中使用bus来实现不同组件的传值(更推荐vuex)

    前言 在vue中实现用公共bus来实现不同组件直接的传值 实现方法 1 main js中在window上挂载一个变量EventBus window EventBus new Vue 2 传方法页面 必须在页面的销毁阶段传方法 至于原因 请看
  • Linux中处置挖矿病毒样本演示

    一 病毒特征 1 top 查看cup使用率 CUP使用率极高 也可以看到它的PID 2 查看网络连接数 netstat anpt grep tcp 连接数较高 二 处置 1 kill pid 尝试删除可疑进程 可以删除 但是他还是会自动启动
  • 亲测!推荐一款k8s前端操作界面 Kuboard for K8S

    文章目录 一 前提 二 安装Kuboard for K8S 2 1 安装 2 2 加载Kuboard镜像 2 3 准备kuboard yaml文件 2 4 执行安装命令 三 启动观察 3 1 获取token 3 2 打开浏览器 享受飞一般的
  • Redis集群配置

    目录 1 创建两个桥接虚拟机实例 1 1 修改桥接网络 1 2 修改本地网络配置文件 1 3 测试 2 配置redis集群 2 1 安装redis 2 1 1 安装依赖 2 1 2 下载redis安装包上传服务器并解压 2 1 3 解压文件
  • 搜索二叉树

    全文目录 概念 实现二叉搜索树 查找 插入 删除 性能分析 概念 二叉搜索树 它或者是一棵空树 或者是具有以下性质的二叉树 若它的左子树不为空 则左子树上所有节点的值都小于根节点的值 若它的右子树不为空 则右子树上所有节点的值都大于根节点的
  • Matlab/Simulink仿真问题及技巧汇总【持续更新】

    本文章会汇总Matlab Simulink仿真问题和相关技巧汇总 如果有问题可以查询本文 有相关问题可以私信我 给你把你们的问题同步更新 wx shadowknight007 本文章会持续更新 设置问题 仿真参数设置和示波器的使用 http
  • 矩阵列主元三角分解

    一 列主元三角分解定理 如果A为非奇异矩阵 则存在排列矩阵P使 PA LU 其中L为下三角矩阵 U为上三角矩阵 即A P 1LU 二 列主元三角分解Python代码 自己原创 def pivot lu decomposition coeff
  • ​stp文件转wrl

    什么是一 stp 文件 STP 文件是用于在 CAD 和 CAM 应用程序之间交换产品数据的 3D CAD 文件 它包含有关 3D 对象的信息 并以类似于STEP文件格式的方式保存 STP 文件根据STEP应用程序协议 ISO 10303
  • 【HBZ分享】TCP可靠性传输如何保证的?以及传输优化之Nagle算法

    ACK机制 ACK机制是发送方与接收方的一个相互确认 客户端向服务端发送连接请求 此时服务端要回馈给客户端ACK 以表示服务端接到了客户端请求 这是第一和的第二次握手 客户端接收到服务端响应后 同样也要回馈服务端的响应 告知服务端我收到了你
  • 数据结构和算法(查找算法[ 二分、插值 ]、哈希表构成、普通二叉树操作、线索化和遍历[ 前、中、后 ] 序)

    常用查找算法 顺序 线性 查找 二分查找 折半查找 插值查找 顺序查找 按照顺序 遍历数组 比对数字 如果找到 返回下标 由于比较简单 不再介绍 二分查找 二分查找思路分析 需要查找的数组必须是有序的 否则查找没有意义 二分查找代码实现 p