二叉树-查找指定节点 以上一篇为基础来看看树中的查找。 问题 (1)编写前序查找,中序查找和后序查找的方法。 (2)并分别使用三种查找方式,查找treenode=5的节点。 this.root.PreOrder(); } else { Console.WriteLine("二叉树为空 = new TreeNode(4,"王五"); TreeNode node5 = new TreeNode(5, "赵六"); //手动创建二叉树 (5); if (treeNode2 ! 后序查找效率最高只需要查找2次。
1.2 “树”的成长过程 决策树基于“树”结构进行决策的,这时我们就要面临两个问题 : “树”怎么长。 这颗“树”长到什么时候停。 2. 树形结构为什么不需要归一化? 因为数值缩放不影响分裂点位置,对树模型的结构不造成影响。 按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。 }R1(j,s)={x∣x(j)≤s}andR2(j,s)={x∣x(j)>s} 而CART回归树实质上就是在该特征维度对样本空间进行划分,而这种空间划分的优化是一种NP难问题,因此,在决策树模型中是使用启发式方法解决 典型CART回归树产生的目标函数为: ∑xi∈Rm(yi−f(xi))2\sum_{x_i\in R_m}(y_i-f(x_i))^2xi∈Rm∑(yi−f(xi))2 因此,当我们为了求解最优的切分特征 最终得到一棵回归树。 参考文章:经典算法详解–CART分类决策树、回归树和模型树 4.
今天我们来讲一讲记忆化搜索和树这个数据结构。记忆化搜索是对搜索算法的一个优化,涉及到记忆化搜索的题目都或多或少有一点技巧。至于树,它的定义非常简单,也有非常多的应用。 记忆化搜索 记忆化搜索(Memorization)是搜索算法的一个改进。 关于动态规划的内容,读者可以查看这两节 Leetcode | 第一节:动态规划(上) Leetcode | 第2节:动态规划(下) 好的,那么我们来看几道记忆化搜索的习题吧。 读者可以通过递归树来进一步明晰这个过程。 Problem 2: Leetcode 329 给定一个 m x n 整数矩阵 matrix ,找出其中 最长递增路径 的长度。 因为可以采用的方案是:跳 1 个单位到第 2 块石子, 然后跳 2 个单位到第 3 块石子, 接着 跳 2 个单位到第 4 块石子, 然后跳 3 个单位到第 6 块石子, 跳 4 个单位到第 7 块石子
在a子树中插入一个新结点,导致a子树的高度从h变成h+1,不断向上更新平衡因子,导致10的平衡因子从1变成2,10为根的树左右高度差超过1,违反平衡规则。 10为根的树右边太高了,需要往左边旋转,控制两棵树的平衡。 旋转核心步骤,因为10<b子树的值<15,将b变成10的右子树,10变成15的左子树,15变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵的高度恢复到了插入之前的h+2,符合旋转原则。 场景2:h>=1时,新增结点插入在f子树,f子树高度从h-1变为h并不断更新8->5->10平衡因子,引发旋转,其中8的平衡因子为1,旋转后8和10平衡因子为0,5平衡因子为-1。 场景2:h>= 1时,新增结点插入在f子树,f子树高度从h-1变为h并不断更新12->15->10平衡因子引发旋转,其中12的平衡因子为1,旋转后15和12平衡因子为0,10平衡因子为-1。
第一次接触红黑树是在关于hashMap,上来就扔五个特性,说满足这五个特点的二分搜索树就是红黑树。 (1)每个节点或者是黑色,或者是红色。 (2)根节点是黑色。 瞬时懵逼……我扔十个特性,是不是能定义一个红绿灯树呢。所以一直不明白红黑树为什么要这么定义。 直到今天了解了2-3树,才豁然开朗。2-3树是一种神奇的树,它能够保证该树是一个完美树。 2-3树可以演化成红黑树,这便是保证红黑树效率的根本。 先说奇葩的2-3树,首先2-3树满足二分搜索树,但每个节点可能存在1或2个数据,对应的该节点就可能存在2或3个子节点 2-3树 ? 2-3树引入.png 2-3树插入操作: ? 2-3树.png 2-3树演化为红黑树 将三节点拆为两个节点,并将左数据节点设为红色来实现2-3树同等功能 ? 红黑树.png
上篇python连连看与记忆翻牌游戏(1)讲了连连看的核心判断实现。(最后的remove边界判断有点问题,没有先判断两者是否相等。 感谢@井老师提醒) 原来的: def remove(p1,p2): # p1 和 p2 都在边界,可以直接删除 if (p1[0] == p2[0]) and (p1[0]==0 or (array[0])-1): print('上下边界可以直接删除') 这里直接前面加一句判断是否是同一个点: def remove(p1,p2): if p1[0]==p2[0] and p1[1]==p2[1]: return False # p1 和 p2 都在边界,可以直接删除 if (p1[0] == p2[0]) and (p1[0]= self.on_update() if __name__ == '__main__': game = MyGame() game.run() 上面的代码改改,可以变成记忆翻牌的游戏
通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 二、红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的 3. 红黑树是一颗懂得卸力的树,我们通过红黑树性质的3、4点得知,2 * 最短路径的节点数 <= 最长路径的节点数(注:以极限的思想,最短路径全黑,最长路径一黑一红交替出现(性质3),2条路径黑节点数相同(性质 按照二叉搜索的树方式插入新节点 // 2. ; }; ② 检测新节点插入后,红黑树的性质是否造到破坏(重点) 先看每种情况下如何处理,最后有总结帮助记忆 因为新节点的默认颜色是红色,因此:如果其双亲节点的颜色是黑色,没有违反红黑树任何 性质,则不需要调整 检测其是否满足二叉搜索树(中序遍历是否为有序序列) 2.
我看了答案还是有些不能完全理解,于是又去b站翻了翻教程基础DP,其中提到记忆化的递归(也称记忆化搜索),相当于结合了dp和递归的优点(这时我又觉得比DP还厉害),然后就准备写写记忆化递归。 ---- 目录 1.记忆化递归的解释与分析 2.记忆化递归的应用 ---- 一、记忆化递归的解释与分析 前面说道它结合了dp和递归的优点,分别是记忆化和逻辑清晰易懂。 下面还是结合斐波那契数列的来理解: F(0)=F(1)=1; F(n)=F(n-1)+F(n-2) (n≥2,n∈N*); 这里直接给出函数代码,再进行解释: int F(int n){ if(n<2)f[n]=1; //这里f[]是储存数据的数组 else if(f[n]==0) //这里是重点 f[n]=F(n-1)+F(n-2); return f[n]; } 代码解释 打个比方,dp就相当于计算了一个方阵上所有的点(无论有没有利用价值),而记忆化递归相当于计算了方阵上有价值的点,因此记忆化递归的运行时间可能比dp还要短。
该校的员工具有等级结构, 即师生关系构成一棵树, 以校长为树根. 员工号是1到N之间的整数. 人事部门把所有员工按活跃度排序. 样例输入 7 1 1 1 1 1 1 1 1 3 2 3 6 4 7 4 4 5 3 5 0 0 样例输出 5 //思路: 记忆化搜索 + 二叉树 //常理来说大学里 一个导师可以有多个学员 但一个学员只能有一个导师(二叉树) // 导师和学员不能同时邀请,那就是除了同时邀请外 还有三种情况,邀导不邀学 //邀学不邀导 和都不邀 (0与1 )的关系 通过DFS枚举各类情况 int L,int last) { //优化 记忆数组 if(dp[L][last]! =0)ans2+=dfs(ds[L][i],1),i++; if(last==0)//若该员工的导师未邀请 {dp[L][0]=max(ans1,ans2+v[L
---- 2-3-4树 定义 2-3-4树是四阶的 B树(Balance Tree),它的结构有以下限制: 所有叶子节点都拥有相同的深度。 节点只能是 2-节点、3-节点、4-节点之一。 对应红黑树 至于为什么说红黑树是 2-3-4树的一种等同呢,这是因为 2-3-4树的每一个结点都对应红黑树的一种结构,所以每一棵 2-3-4树也都对应一棵红黑树,下图是 2-3-4树不同结点与红黑树子树的对应 由红黑树的性质5,和 2-3-4树的性质1,为了便于理解红黑树和 2-3-4树的对应关系,我们可以把红黑树从根结点到叶子结点的黑色结点个数定义为高度。 下面来对照着 2-3-4树说一下红黑树结点的添加和删除: ---- 结点插入 2-3-4树中结点添加需要遵守以下规则: 插入都是向最下面一层插入; 升元:将插入结点由 2-结点升级成 3-结点,或由 3 2-结点对应红黑树中的单个黑色结点,插入时直接成功(对应 2-结点升元)。
今天扫了收藏夹里一个TED视频,所以也借此总结一下上半辈子学到的点滴技巧吧~ 关于记忆技巧, 我印象最深的是小时候电视里有个老师在讲如何记忆英语单词,比如同样的词根,只要变换一个字母就可以记住一大批单词这样的技巧 第二个印象,是一个女的演讲者提到的记忆技巧, 她的记忆技巧可以归纳为一个词: “标新立异”, 也就是给每一个你要记忆的事物都打上一个不同寻常的标签,突出强烈的反差感, 比如在脑海里描绘一幅“隔壁老王蹲在一个十米的茅坑里 第三个印象是一个TED演讲者, 他的方法是是图像记忆法, 给每一个词语或者生硬的字面都配合上一幅图, 这种记忆法其实很好的阐述了那句英语谚语:"one picture is better than a 第四个印象是某人发明了个记忆宫殿(Memory Palace)这样的记忆技巧或者说术语,总结下来就是上下文关联(Context),将你要记忆的信息放到一个上下文中,这个上下文是任何你熟悉的场景,比如你的房子 关联性,将要记忆的信息通过某种故事线或者物理场景(上下文Context) 串联起来,可以帮助我们批量记忆一组信息,配合强烈反差的故事线更好。
在人工智能领域,尤其是基于大语言模型(LLM)的智能体(Agent)系统中,记忆机制是实现持续、连贯和个性化交互的核心基石。记忆系统模拟了人类的认知结构,通常划分为短期记忆和长期记忆。 第一章:短期记忆——智能体的工作记忆与意识流1.1定义与本质短期记忆是智能体用于处理当前任务或单次会话的临时信息存储区。 检索当新的会话开始时,Agent不会加载整个长期记忆库(那样会瞬间爆满短期记忆)。相反,它会根据当前的用户查询和短期记忆的上下文,去长期记忆库中寻找最相关的信息。 记忆冲突与更新:当新信息与旧记忆矛盾时,如何更新或版本化管理记忆(例如,用户之前喜欢咖啡,现在改喝茶了)。 检索长期记忆:系统将当前查询与短期记忆的上下文结合,作为“检索键”,在长期记忆库中进行向量相似性搜索,找出相关记忆。
给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。 而图2就不是同构的。 现给定两棵树,请你判断它们是否是同构的。 输入格式: 输入给出2棵二叉树树的信息。 – – H – – C 0 2 G – 3 F – – A 1 4 输出样例2: No 题意:给我们两棵树,让我们去判断这两棵树是否是同构的,同构的定义题目给出,即通过足够次数的左右子树变换变换,两棵树能达到一样即位同构树 分为五种情况:1都为空树,2一个空一个不空,3都不空但树根不同,4都没有左子树,5都有左子树,且左子树值相同 #include<iostream> #define null -1 using namespace 树的同构
前言: AVL树作为一种结构,理解树的本身是不大难的,难的在于,树旋转之后的连接问题,写AVL树的代码大部分都是在旋转部分,所以连接问题是比较需要细心的,那么这里来说呢,把细心做好,变量的位置放好,连接的次序连接对 ,树还是没有平衡,那么我们再左旋,相当于旋转回来了,整个树的结果是没有变的。 选择b c作为例子,当我们往b c插入数据的时候,90的平衡因子变为了-2,此时parent就是90,那么我们需要一个操作让该树变成完全的左子树高,这样再右旋转,才可以保持平衡,那么如何变成完全的左子树高呢 ->_bf == 2 && cur->_bf == -1) { RotateRL(parent); } else if (parent->_bf == -2 && cur->_bf = ,但是对于平衡因子的控制要求太严格了,所以红黑树出现了,红黑树是一种近似平衡的结构~ 感谢阅读!
学习过2-3树之后就知道应怎样去理解红黑树了,如果直接看「算法导论」里的红黑树的性质,是看不出所以然。 此时我们借着2-3树去理解基本的红黑树,当然我会在后几篇文章介绍2-3-4树以及基于2-3-4树的红黑树。 抛开上面二分搜索树满足红黑的性质,我们知道2-3树不是二叉树,我们把它转换成一颗二叉树,2-节点很好转,3-节点转二叉却有两种,如下图: ? 左倾红黑树和2-3树等价的定义 红黑树的定义是含有红黑链接并满足下列条件的二分搜索树: 1.红链接均为左连接; 2.没有任何一个节点同时和两条红链接相连; 3.该树是完美黑色平衡的,即任意空链接到根节点的路径上的黑链接数量相同 因为2-3树不存在永久的4-节点,4-节点终归要分解的(在2-3-4树中,为了更好地插入和删除,4-节点可存在于叶子节点和非叶子节点)2-3树一样不行,所以在2-3树中没有任何一个节点能同时和两条红链接相连
线段树不支持的操作:删除,插入 ---- 常见的平衡树 treap 慢||好写 sbt(大小平衡的树) 非常快 比较好写 ||功能不全 rbt 红黑树 特别快 || 非常难写 以上操作支持插入删除 ≈O(sqrt(N)) 不太好写,功能强大 ---- 可持久化Treap 平衡树一定是二叉树 左儿子里面的元素一定比他小 右儿子一定比当前节点大 中序遍历一定排好序 每次递归的查询 小 ,直接rand,深度一定是logN级别的 merge(p1,p2):把以p1为根的Treap和以P2为根的Treap合并成一个Treap,p1的最大值应该<=P2的最小值 split(p,k):把以p为根的 Treap拆成两个Treap,一个有k个数,另一个有n-k个数,k为前k小 插入:先把树分为x,y两部分,然后把新的节点a看做是一棵树,先与x合并,合并完之后将合并的整体与y合并 删除: ? merge实现 先找key最大的,比较p1,p2 若p1大 p1作为根,p2一定在p1的右边, p1.L=p1.L p1.r=merge(p2,p1.r) 若p2 p2.r=p2.r p2
实现功能:同平衡树Treap 1(BZOJ3224 / tyvj1728) 这次的模板有了不少的改进,显然更加美观了,几乎每个部分都有了不少简化,尤其是删除部分,这个参照了hzwer神犇的写法,在此鸣谢 ,然后,贴模板走人 1 var 2 i,j,k,l,m,n,head,tot:longint; 3 a,b,lef,rig,fix:array[0..100010] of longint readln(j,k); 110 case j of 111 1:ins(head,k); 112 2:
前言 前面的文章我们已经学习了二叉搜索树和平衡二叉搜索树AVL树,今天我们再来了解一种新的平衡树2–3树,2–3树由约翰·霍普克洛夫特于1970年发明,在计算机科学中,2–3树是一种树型数据结构,内部节点 前面的文章提到过的二叉树,每个节点的孩子个数最多的是2个,并且每个节点只有一个值,而2-3树的节点的孩子个数只能是2个或者3个,这是一种多路树的结构,类似的结构还有2-3-4树,B+树等,多路树的存在除了支持树的平衡外 2-3树 VS 二叉搜索树 同样的一组数据,在2-3树和二叉搜索树里面的对比如下: ? 关于2-3-4树 2-3-4树与2-3树类似,只不过当父节点的值是3的时候,节点的孩子个数可以有4个,如下: ? 总结 本篇文章,主要介绍了2-3树相关的知识,2-3树,2-3-4树以及B树都不是二叉树,但与二叉树的大致特点是类似的,它们是一种平衡的多路查找树,节点的孩子个数可以允许多于2个,虽然高度降低了,但编码相对复杂
判断二叉树是否为完全二叉树: 1、层序遍历走,空也进队列 2、遇到第一个空节点时,开始判断,后面全空就是完全二叉树,后面有非空就不是完全二叉树。 二叉树的性质 1.规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^(i-1)个节点, 2.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是2^h-1, 3.对任何一棵二叉树,如果度为0 ,其叶子结点的个数为n0,度为2的分支结点个数为n2,则有n0=n2+1,(增加一个度为1,减少一个度为0) 4.若规定根节点的层数为1,具有n个结点的满二叉树的深度,h=log2(n+1) 5.对于具有 n个节点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的节点有: 题目:具有2n个节点的完全二叉树中,叶子结点的个数是多少个 n0+n1+n2=2n n0=n2+ 一棵完全二叉树的节点数为531,那么这棵树的高度为多少? 由前面我们可以知道,一棵完全二叉树的节点数是2^h-1个节点。那么此时,我们可以看最少有多少个节点,也就是h-1层。也就是2^(h-1)-1。
图2:向量检索流程图向量检索流程向量检索流程包括以下步骤:数据预处理:对原始数据进行清洗和格式化,提取出有用的信息。 图3:知识图谱构建与更新流程图Neo4j构建示例以下是使用Neo4j构建知识图谱的Python代码示例:from py2neo import Graph, Node, Relationshipimport "创建实体间的关系""" # 获取实体节点 node1 = self.graph.nodes.match(name=entity1).first() node2 = self.graph.nodes.match(name=entity2).first() if node1 and node2: # 创建关系 "支持", "深度学习")]for triple in triples: analyzer.add_knowledge_triple(triple[0], triple[1], triple[2]