当前位置: 首页 > 后端技术 > Java

二叉树递归例程(四):最低共同祖先,党的最大幸福值

时间:2023-04-01 21:44:08 Java

今天继续二叉树的递归例程。1.最低公共祖先给定一棵二叉树的头节点和另外两个节点a和b,返回a和b的最低公共祖先。最低共同祖先的定义:查找a和b,第一共同祖先(这个共同祖先也可能是a或b本身)1.递归套路的思想是对于二叉树中的任意节点X,还有两个节点a,b的最低共同祖先,a和b分为两种情况。(1)与X无关,即最低共同祖先不是Xa,b在左树某点聚集a,b在右树某点聚集a,b不完整在左树和右树中(2)与X相关,即最低共同祖先为X,在左树中找到a和b中的一个,在右树中找到另一个X,在右树中找到b左树或右树。Xisb,foundintheleftorrighttreea表示每次从左树和右树中,我们需要是否有a,是否有b,a和b汇合的最低祖先。因此,可以定义如下Infoclass/***@authorJava和算法学习:Monday*/publicstaticclassInfo{publicbooleanfindA;公共布尔查找B;公共节点答案;publicInfo(booleanfindA,booleanfindB,Nodeanswer){this.findA=findA;this.findB=findB;this.answer=答案;newInfo(false,false,null),即认为空节点不包含a,不包含b,最低公共祖先为null。(2)然后根据列出的所有可能性编写递归例程的代码,因为要形成整个递归,所以每一步都必须返回Info类。(不假思索的获取左右子树的Info,拼凑自己的Info,返回自己的Info)/***@authorJava与算法学习:Monday*/publicstaticInfoprocess(Nodex,Nodea,节点b){if(x==null){returnnewInfo(false,false,null);}//获取左右子树信息InfoleftInfo=process(x.left,a,b);信息rightInfo=process(x.right,a,b);//自己编造信息//不要忽略你是a还是bbooleanfindA=leftInfo.findA||rightInfo.findA||x==一个;布尔findB=leftInfo.findB||rightInfo.findB||x==b;节点答案=空;if(leftInfo.answer!=null){//如果左树中有一个答案,那么这个答案就是最后的答案answer=leftInfo.answer;}elseif(rightInfo.answer!=null){//右树中有一个答案,那么这个答案就是最终答案answer=rightInfo.answer;}else{//左树和右树都没有答案,但是找到了a和b,那么答案就是当前节点Xif(findA&&findB){answer=x;}}returnnewInfo(findA,findB,answer);}(3)main函数调用递归方法得到结果/***@authorJava与算法学习:周一*/publicstaticNodelowestAncestor(Nodehead,节点a,节点b){if(head==null){返回null;}returnprocess(head,a,b).answer;}全部代码地址:https://github.com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/LowestAncestor.java2.一方幸福值最大的员工信息定义如下:publicstaticclassEmployee{//该员工能带给员工的幸福值//这个员工的直属下属有哪些Listnext;}一个员工只有一个直属上级,即公司员工的层级结构是一个多叉树。现在公司邀请员工参加聚会,要求不能同时邀请员工和员工的任何下属(即不能同时邀请直属上级和下属)。如何邀请员工,才能使参加聚会的员工的幸福值在所有情况下都达到最大。最后返回最大的快乐值。1、递归套路思路对于任意以X为头,包含a、b、c三个子节点的多叉树,其最大幸福值分为两种:(1)X参与的最大幸福值theparty=X.happy+anotcomingmax(happy)+bnotcomingmax(happy)+cnotcomingmax(happy)(2)Xnotcomingtotheparty最大幸福值=max(acomingmax(happy),a不来max(happy))+max(b来时max(happy),b不来时max(happy))+max(c来时max(happy),c不来时max(happy)'来了)最后,最大的幸福值就是以上两种情况的最大值。也就是说,每次我们需要从左树和右树来,我们需要最大的幸福值,所以我们可以定义如下Info类/***@authorJava和算法学习:Monday*/publicstaticclassInfo{//最大收入publicintyes;//不公开的最大收入intno;公共信息(intyes,intno){this.yes=yes;这个。没有=没有;}}2.递归例程代码(1)先判断为空时设置好不好,此时设置好。当节点为空时,newInfo(0,0),即认为空节点的最大收益为0,不来的最大收益为0。(2)然后根据列出的所有可能性编写递归例程的代码,因为要形成整个递归,所以每一步都必须返回Info类。(不假思索的获取所有子树的Info,拼凑自己的Info,返回自己的Info)/***@authorJava与算法学习:周一*/publicstaticInfoprocess(Employeex){if(x==null){返回新信息(0,0);}//x不来时的最大幸福值intno=0;//x到来时的最大幸福值intyes=x.happy;for(Employeee:x.next){InfonextInfo=process(e);//如果x来了,所有下属都不能来yes+=nextInfo.no??;//如果x不来,求每个下属来或不来的最大值no+=Math.最大(nextInfo.yes,nextInfo.no??);}returnnewInfo(yes,no);}(3)main函数调用递归方法得到结果/***@authorJava与算法学习:星期一*/publicstaticintmaxHappy(Employeehead){if(head==null){返回0;}信息processInfo=process(head);returnMath.max(processInfo.yes,processInfo.no??);}所有代码地址:https://github。com/monday-pro/algorithm-study/blob/master/src/basic/binarytree/MaxHappy.java

猜你喜欢