一、LeetCode 236 二叉树的最近公共祖先
题目链接:236.二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/
思路:利用后序遍历是天然回溯过程、方便实现自底向上查找的原理,递归寻找公共祖先。
class Solution {
//后序遍历左右中 是天然的回溯过程 方便实现自底向上查找
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//递归结束条件:遍历结束、祖先是自己
if(root == null || root == p || root == q){
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left == null && right == null){ //未找到
return null;
}else if(left == null && right != null){//在左或右找到一个指定节点
return right;
}else if(left != null && right == null){
return left;
}else{//两个指定节点都找到
return root;
}
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
二、LeetCode 235 二叉搜索树的最近公共祖先
题目链接:235.二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/
思路:利用二叉搜索树有序的特性,前中后序遍历皆可,找到介于q、q之间的root。
class Solution {
//利用二叉搜索树的特性,root.val第一次出现在p、q之间即为最近公共祖先
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val > p.val && root.val > q.val){//root的值大于p、q的值 应该往root左子树找
return lowestCommonAncestor(root.left,p,q);
}else if(root.val < p.val && root.val < q.val){//root的值小于p、q的值 应该往root右子树找
return lowestCommonAncestor(root.right,p,q);
}else{//在两者之间,直接返回
return root;
}
}
}
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
三、小结
这世界总有人忙忙碌碌寻宝藏~ 待会见ovo