235. Lowest Common Ancestor of a Binary Search Tree 235.二叉搜索树的最低共同祖先

Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.

According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has both p and q as descendants (where we allow a node to be a descendant of itself).”

Given binary search tree:  root = [6,2,8,0,4,7,9,null,null,3,5]

 

Example 1:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
Output: 6
Explanation: The LCA of nodes 2 and 8 is 6.

Example 2:

Input: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
Output: 2
Explanation: The LCA of nodes 2 and 4 is 2, since a node can be a descendant of itself according to the LCA definition.

首先,退出情况起码可以写写。

边界情况。这题比较特殊,要考虑到左边、右边一边就是根节点的情况


从左右的角度思考。也没法思考吧
root.left = 这样没辙。其实就是这么写的,不用怀疑!这一步叫做divide
conquer指的是征服(需要进一步完成具体实现),好吧。其实好像都是这样写的!好吧,更加理解DC了!

因为要用到左右节点,所以要把左右节点都放到DC的参数中。

然后一个基本原理就是:左右节点非空的时候,就是两者的共同父节点

 彻底忘了有DC这回事了,尼玛这才过了几天

/**
 * 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) {
        //边界情况。这题比较特殊,要考虑到左边、右边一边就是根节点的情况
        if ((root == null) || (p == root) || (q == root))
            return root;
        
        //分隔 divide
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        
        //实现 conquer
        //都不空,左右一个为空,都空
        if ((left != null) && (right != null)) {
            return root;
        }else if (left != null) {
            return left;
        }else if (right != null) {
            return right;
        }else {
            return null;
        }
        
        //return root;
    }
}
View Code

 



posted @ 2020-05-25 22:11  苗妙苗  阅读(100)  评论(0编辑  收藏  举报