zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    HDU 3572 Task Schedule(拆点+最大流dinic)
    POJ 1236 Network of Schools(Tarjan缩点)
    HDU 3605 Escape(状压+最大流)
    HDU 1166 敌兵布阵(分块)
    Leetcode 223 Rectangle Area
    Leetcode 219 Contains Duplicate II STL
    Leetcode 36 Valid Sudoku
    Leetcode 88 Merge Sorted Array STL
    Leetcode 160 Intersection of Two Linked Lists 单向链表
    Leetcode 111 Minimum Depth of Binary Tree 二叉树
  • 原文地址:https://www.cnblogs.com/immiao0319/p/12961197.html
Copyright © 2011-2022 走看看