字节跳动算法题:给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

    科技2023-10-07  81

    字节跳动算法题

    二叉树

    题目描述 给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

    题目分析 这种嵌套方法最好画颗树来实际模拟一下比较好理解。 遍历查找每个节点,如果找到了要找的o1或o2节点,则将找到的o1或o2的值作为返回值,没找到的则返回0; 这样,假设我们找到了第一个o1,那么,对于o1的父节点来说,返回值即是o1的值; 如此往复循环查找,直到最后,我们找到一个节点,他的left和right的值分别是o1的值和o2的值,即,他的左子树或右子树分别能达到o1节点或o2节点; 这时,我们的返回值便不再会出现left == 0 或 right == 0的情况,即会直接返回当前节点的val,也就是找到了最近的公共祖先节点。

    下面是JAVA算法实现:

    public int lowestCommonAncestor (TreeNode root, int o1, int o2) { // write code here if(root == null){ return 0; } //如果找到需要查找的值后,对于他的父节点那层循环来说,返回值即是找到的这个值。 if(root.val == o1 || root.val == o2){ return root.val; } int left = lowestCommonAncestor(root.left,o1,o2); int right= lowestCommonAncestor(root.right,o1,o2); //如果左右节点总有一个为0,说明只找到一个节点,所以返回值永远是找到的那个节点的值; //当找到了最近公共祖先节点,即这个祖先节点的left和right分别是我们要找到o1,o2的值。则会返回当前这个公共祖先节点的值。 if(left == 0){ return right; } if(right == 0){ return left; } return root.val; }

    参考https://www.nowcoder.com/practice/e0cc33a83afe4530bcec46eba3325116?tpId=188&&tqId=35624&rp=1&ru=/ta/job-code-high-week&qru=/ta/job-code-high-week/question-ranking

    Processed: 0.016, SQL: 8