力扣235. 二叉搜索树的最近公共祖先(java解法)

Problem: 235. 二叉搜索树的最近公共祖先

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

本题目依然可以使用236题中同样的思路去解决
力扣236. 二叉树的最近公共祖先(java DFS解法)
但是鉴于二叉搜索树的特性我们可以得到如下的解题思路:

1.当给定的节点p或者q其中一个为另一个的祖先节点时,则作为祖先节点的那一个节点即为最近公共祖先;
2.当在遍历树的节点时,若当前节点的值大于q或q中的一个节点值同时小于另一个节点值,则当前节点为节点q与p的最近公共祖先
3.若不满足条件2则:

3.1若当前节点同时大于q与p的节点的值,则说明该继续往当前节点的左子树查找
3.2若当前节点同时小于q与p的节点的值,则说明该继续往当前节点的右子树查找

解题方法

非递归写法:

1.定义运用遍历的辅助指针temp初始化指向root节点;
2.若当前节点的值同时小于节点q与p的值,则继续遍历当前节点的右子树( t e m p = t e m p . r i g h t temp = temp.right temp=temp.right);若同时大于节点q与p的值,则继续遍历当前节点的左子树( t e m p = t e m p . l e f t temp = temp.left temp=temp.left
3.若不满足1与2则说明当前节点可能等于q、p节点中的一个,或者当前节点的值大于q或q中的一个节点值同时小于另一个节点值,即当前节点为最近公共祖先
**补充注意:*3中之所以说当前节点存在情况“可能等于q、p节点中的一个”*,是因为题目原始条件是保证了树中的每一个节点值均不相同,应当注意该点!!!

递归写法:

1.若当前节点等于q、p节点中的一个,或者当前节点的值大于q或q中的一个节点值同时小于另一个节点值退出递归
2.若当前节点的值同时小于节点q与p的值,则递归遍历当前节点的右子树;
3.当前节点的值同时大于节点q与p的值,则递归遍历当前节点的左子树

复杂度

非递归写法:
时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( 1 ) O(1) O(1)

递归写法
时间复杂度:

O ( n ) O(n) O(n)

空间复杂度:

O ( h ) O(h) O(h); h h h为树的高度

Code

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
    /**
     * 非递归解法
     *
     * @param root 树的根节点
     * @param p    给定节点p
     * @param q    给定节点q
     * @return TreeNode
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        TreeNode temp = root;
        while (true) {
            if (temp.val < p.val && temp.val < q.val) {
                temp = temp.right;
            } else if (temp.val > p.val && temp.val > q.val) {
                temp = temp.left;
            } else {
                return temp;
            }
        }
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

class Solution {
   /**
     * 递归写法
     *
     * @param root 树的根节点
     * @param p    给定节点p
     * @param q    给定节点q
     * @return TreeNode
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == p || root == q || (root.val < p.val && root.val > q.val)
                || (root.val > p.val && root.val < q.val)) {
            return root;
        }
        //遍历左子树
        if (root.val > q.val && root.val > p.val) {
            return lowestCommonAncestor(root.left, p, q);
        } else {
            //遍历右子树
            return lowestCommonAncestor(root.right, p, q);
        }
    }
}

你可能感兴趣的:(力扣题目,leetcode,java,算法)