C#,笛卡尔树(Cartesian Tree)的构造、遍历算法与源代码

news/2024/7/24 10:22:28 标签: c#, 算法, 开发语言, 笛卡尔

 René Descartes

一、笛卡尔(René Descartes)

勒内·笛卡尔(René Descartes,1596年3月31日-1650年2月11日),1596年3月31日生于法国安德尔-卢瓦尔省的图赖讷(现笛卡尔,因笛卡尔得名),1650年2月11日逝于瑞典斯德哥尔摩,法国哲学家、数学家、物理学家。他对现代数学的发展做出了重要的贡献,因将几何坐标体系公式化而被认为是解析几何之父。
他还是西方现代哲学思想的奠基人之一,是近代唯心论的开拓者,提出了“普遍怀疑”的主张。他的哲学思想深深影响了之后的几代欧洲人,并为欧洲的“理性主义”哲学奠定了基础。
笛卡尔最为世人熟知的是其作为数学家的成就。他于1637年发明了现代数学的基础工具之一——坐标系,将几何和代数相结合,创立了解析几何学。同时,他也推导出了笛卡尔定理等几何学公式。值得一提的是,传说著名的心形线方程也是由笛卡尔提出的。
在哲学上,笛卡尔是一个二元论者以及理性主义者。他是欧陆“理性主义”的先驱。关于笛卡尔的哲学思想,最著名的就是他那句“我思故我在 ”。他的《第一哲学沉思集》(又名《形而上学的沉思》)仍然是许多大学哲学系的必读书目之一。
在物理学方面,笛卡尔将其坐标几何学应用到光学研究上,在《屈光学》中第一次对折射定律作出了理论上的推证。在他的《哲学原理》第二章中以第一和第二自然定律的形式首次比较完整地表述了惯性定律,并首次明确地提出了动量守恒定律。这些都为后来牛顿等人的研究奠定了一定的基础。

二、笛卡尔树(Cartesian Tree)

笛卡尔树是一种特定的二叉树数据结构,可由数列构造,
在范围最值查询、范围top k查询(range top k queries)等问题上有广泛应用。
 

using System;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
	public static partial class Algorithm_Gallery
	{
		/// <summary>
		/// 遍历结果
		/// </summary>
		public static List<string> Traversal_Result = new List<string>();

		/// <summary>
		/// In-Order遍历
		/// </summary>
		/// <param name="node"></param>
		public static void Cartesian_Tree_Inorder_Traversal(BinaryNode node)
		{
			if (node == null)
			{
				return;
			}
			Cartesian_Tree_Inorder_Traversal(node.Left);
			//Console.Write(node.Data + " ");
			Traversal_Result.Add(node.Data);
			Cartesian_Tree_Inorder_Traversal(node.Right);
		}

		private static BinaryNode Cartesian_Tree_Utility(int root, int[] arr, int[] parent, int[] leftchild, int[] rightchild)
		{
			if (root == -1)
			{
				return null;
			}
			BinaryNode temp = new BinaryNode(arr[root]);

			temp.Left = Cartesian_Tree_Utility(leftchild[root], arr, parent, leftchild, rightchild);
			temp.Right = Cartesian_Tree_Utility(rightchild[root], arr, parent, leftchild, rightchild);

			return temp;
		}

		// A function to create the Cartesian Tree in O(N) time
		/// <summary>
		/// 创建笛卡尔树
		/// </summary>
		/// <param name="arr"></param>
		/// <param name="n"></param>
		/// <returns></returns>
		public static BinaryNode Cartesian_Tree_Growth(int[] arr, int n)
		{
			int[] parent = new int[n];
			int[] leftchild = new int[n];
			int[] rightchild = new int[n];

			Array_Initialize(parent, -1);
			Array_Initialize(leftchild, -1);
			Array_Initialize(rightchild, -1);

			int root = 0, last;

			for (int i = 1; i <= n - 1; i++)
			{
				last = i - 1;
				rightchild[i] = -1;

				while (arr[last] <= arr[i] && last != root)
				{
					last = parent[last];
				}

				if (arr[last] <= arr[i])
				{
					parent[root] = i;
					leftchild[i] = root;
					root = i;
				}
				else if (rightchild[last] == -1)
				{
					rightchild[last] = i;
					parent[i] = last;
					leftchild[i] = -1;
				}
				else
				{
					parent[rightchild[last]] = i;
					leftchild[i] = rightchild[last];
					rightchild[last] = i;
					parent[i] = last;
				}

			}

			parent[root] = -1;

			return (Cartesian_Tree_Utility(root, arr, parent, leftchild, rightchild));
		}

		private static void Array_Initialize(int[] arr, int value)
		{
			for (int i = 0; i < arr.Length; i++)
			{
				arr[i] = value;
			}
		}
	}
}


http://www.niftyadmin.cn/n/5385020.html

相关文章

微信小程序的双向数据绑定和vue的哪里不一样?下拉刷新的方式代码示例

小程序的双向数据绑定和Vue的双向数据绑定有一些不同之处。 实现方式&#xff1a;小程序的双向数据绑定采用的是数据劫持的方式&#xff0c;通过重写对象的get和set方法来监听数据的变化和更新视图。而Vue使用的是响应式数据的方式&#xff0c;通过使用Object.defineProperty()…

Springboot项目的run debug都是灰色解决方法

IDEA下新建SpringBoot项目后&#xff0c;问题显示如下&#xff1a; 解决方法如下&#xff1a; 这个问题是由于缺少Configuration构建器的原因&#xff0c;因此&#xff1a; 1.点击Add Configuration 添加Spring Boot构建器&#xff0c;启动类选择好&#xff0c;点击确认即可&a…

vue2中几种组件传值方法

1.父子组件传值 父组件在子组件标签中传入fatherMess,在子组件使用$emit,约定子传父事件名,将子组件的数据传递到父组件.通过按钮修改,可以发现,这里的传值是响应式的 步骤: ​ 1.在父组件中给子组件标签添加属性 ​ 2.在子组件中使用props接受数据 ​ 3.子组件中使用数据,…

Flutter自定义tabbar任意样式

场景描述 最近在使用遇到几组需要自定义的tabbar或者类似组件&#xff0c;在百度查询资料中通常&#xff0c;需要自定义 TabIndicator extends Decoration 比如上图中的带圆角的指示器这样实现 就很麻烦&#xff0c; 搜出来的相关也是在此之处上自己画&#xff0c;主要再遇…

HOOPS发布全新CAD文件支持以及改进的API性能版本!增加了对Navisworks和C#支持!

全球工程软件开发工具包的领先提供商Tech Soft 3D今天宣布推出HOOPS Exchange 2024&#xff08;支持30多种文件格式的领先CAD数据转换SDK&#xff09;和HOOPS Publish 2024&#xff0c;用于发布交互式3D PDF、3D HTML和3D CAD数据的领先工具包。 HOOPS Exchange现在支持Navisw…

新版AI系统ChatGPT源码支持GPT-4/支持AI绘画去授权

源码获取方式 搜一搜&#xff1a;万能工具箱合集 点击资源库直接进去获取源码即可 如果没看到就是待更新&#xff0c;会陆续更新上 新版AI系统ChatGPT网站源码支持GPT-4/支持AI绘画/Prompt应用/MJ绘画源码/PCH5端/免授权&#xff0c;支持关联上下文&#xff0c;意间绘画模型…

【MySQL】事务的一致性究竟怎么理解?

众所周知&#xff0c;事务有四大特性&#xff1a;原子性、一致性、隔离性、持久性&#xff0c;除了一致性&#xff0c;其他三类特性都很好理解。而关于一致性的解释有点让人头疼&#xff0c;我查了很多文章&#xff0c;大多类似&#xff1a;事务的执行必须使数据库处于一致状态…

论文阅读:How Do Neural Networks See Depth in Single Images?

是由Technische Universiteit Delft(代尔夫特理工大学)发表于ICCV,2019。这篇文章的研究内容很有趣,没有关注如何提升深度网络的性能&#xff0c;而是关注单目深度估计的工作机理。 What they find&#xff1f; 所有的网络都忽略了物体的实际大小&#xff0c;而关注他们的垂直…