二叉树&二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        
        // 根据二叉搜索树的特性来解答问题 
        /**
          * 二叉搜索树左边节点都小于根节点,右边节点都大于分界点,所以问题
          * 有三种情况  pq一左一右 pq都在左 或者右
          * 一左一右的情况 那肯定公共祖先就是Root了 
          * 其他单边情况 就要遍历了
          */
        if (root == null) {
            return null;
        }
        
        if (p.val < root.val && q.val < root.val) {
            TreeNode result = lowestCommonAncestor(root.left, p, q);
            if (result == null) {
                return root;
            }else {
                return result;
            }
        }
        
        if (p.val > root.val && q.val > root.val) {
            TreeNode result = lowestCommonAncestor(root.right, p, q);
            if (result == null) {
                return root;
            }else {
                return result;
            }
        }
        
        return root;
    }
}

二叉树的最近公共祖先

https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        
        // 此题最大的特点就是root的角色在不断地变化,在递归的过程中  left right 也是不算地既充当了 left 和 right 也变相充当了新一轮root
        
        // 上来先判断 root 这个好理解  属于极端情况 直接返回
        if (root == null || root == p || root == q) {
            return root;
        }
        
        // 然后递归二叉树 拿到树的左右节点
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        
        // 遍历结束 左右都为空 说明二叉树中不存在 p q 直接返回null即可
        if (left == null && right == null) return null;
        
        // 遍历结束 左右都不为空 说明二叉树中存在 p q 直接返回root即可
        if (left != null && right != null) return root;
        
        // 其余情况 左边等于空 直接返回右边 右边等于空 直接返回左边即可
        return left == null ? right : left;
    }
}

你可能感兴趣的:(二叉树&二叉搜索树的最近公共祖先)