农场里有许多牛,每头牛都有一个编号,范围在0到10^5之间。为了方便管理,农场主将牛的编号按照族谱关系排列成一棵二叉树。现在农场主想知道,给定两头牛的编号,他们的最近公共祖先是谁。 给定一棵表示牛群族谱的二叉树的根节点 root,以及两个整数 p 和 q,分别代表两头牛的编号。返回这两头牛的最近公共祖先的编号。

区块链毕设网qklbishe.com为您提供问题的解答

农场里有许多牛,每头牛都有一个编号,范围在0到10^5之间。为了方便管理,农场主将牛的编号按照族谱关系排列成一棵二叉树。现在农场主想知道,给定两头牛的编号,他们的最近公共祖先是谁。

给定一棵表示牛群族谱的二叉树的根节点 root,以及两个整数 p 和 q,分别代表两头牛的编号。返回这两头牛的最近公共祖先的编号。

非递归做法,使用Map集合保存父子节点,然后分别遍历出两个值p,q的路径。
因为路径是从下到上,所以获得p和q路径集合,以后从任一集合第一个节点遍历即可找出公共节点
import java.util.*;  /*  * public class TreeNode {  *   int val = 0;  *   TreeNode left = null;  *   TreeNode right = null;  *   public TreeNode(int val) {  *     this.val = val;  *   }  * }  */  public class Solution {     /**      * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可      *      *       * @param root TreeNode类       * @param p int整型       * @param q int整型       * @return int整型      */     public int lowestCommonAncestor (TreeNode root, int p, int q) {         // write code here         Queue<TreeNode> queue=new LinkedList<>();         queue.add(root);         //<子节点,父节点>         TreeMap<Integer,Integer> map=new TreeMap<>();         //遍历获取父子节点的map集合         map.put(root.val,Integer.MAX_VALUE);         while(!queue.isEmpty()){             TreeNode node=queue.poll();             if(node.left!=null){                 map.put(node.left.val,node.val);                 queue.add(node.left);             }             if(node.right!=null){                 map.put(node.right.val,node.val);                 queue.add(node.right);             }         }         //获取P节点的路径从下到上         ArrayList<Integer> pathP=new ArrayList<>();         pathP.add(p);         int node=p;         while(true){             node=map.get(node);             if(node==Integer.MAX_VALUE){                 break;             }             pathP.add(node);         }         //获取Q节点的路径从下到上         ArrayList<Integer> pathQ=new ArrayList<>();         pathQ.add(q);         node=q;         while(true){             node=map.get(node);             if(node==Integer.MAX_VALUE){                 break;             }             pathQ.add(node);         }         //进行对比,只要节点相等就是最近公共祖先         for(int i=0;i<pathP.size();i++){             if(pathQ.contains(pathP.get(i))){                 return pathP.get(i);             }         }         return -1;     } }

21:45

以上就是关于问题农场里有许多牛,每头牛都有一个编号,范围在0到10^5之间。为了方便管理,农场主将牛的编号按照族谱关系排列成一棵二叉树。现在农场主想知道,给定两头牛的编号,他们的最近公共祖先是谁。 给定一棵表示牛群族谱的二叉树的根节点 root,以及两个整数 p 和 q,分别代表两头牛的编号。返回这两头牛的最近公共祖先的编号。的答案

欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。

区块链NFT链游项目方科学家脚本开发培训

承接区块链项目定制开发

微信:btc9767

QQ :1330797917

TELEGRAM: BTCOK9

承接区块链项目定制开发


qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 农场里有许多牛,每头牛都有一个编号,范围在0到10^5之间。为了方便管理,农场主将牛的编号按照族谱关系排列成一棵二叉树。现在农场主想知道,给定两头牛的编号,他们的最近公共祖先是谁。 给定一棵表示牛群族谱的二叉树的根节点 root,以及两个整数 p 和 q,分别代表两头牛的编号。返回这两头牛的最近公共祖先的编号。