今天继续二叉树的递归例程。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{//该员工能带给员工的幸福值//这个员工的直属下属有哪些List
