zoukankan      html  css  js  c++  java
  • 【leetcode】235-Lowest Common Ancestor of a Binary Search Tree

    problem

    235. Lowest Common Ancestor of a Binary Search Tree

     二叉搜索树的性质

    Lets review properties of a BST:
    .Left subtree of a node N contains nodes whose values are lesser than or equal to node N's value.
    .Right subtree of a node N contains nodes whose values are greater than node N's value.
    .Both left and right subtrees are also BSTs.

    百科解释

    二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 
    若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
    若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
    它的左、右子树也分别为二叉排序树。

     solution1:递归方法:

    由于二叉搜索树的特点是左<根<右,所以根节点的值一直都是中间值,大于左子树的所有节点值,小于右子树的所有节点值,那么我们可以做如下的判断,如果根节点的值大于p和q之间的较大值,说明p和q都在左子树中,那么此时我们就进入根节点的左子节点继续递归,如果根节点小于p和q之间的较小值,说明p和q都在右子树中,那么此时我们就进入根节点的右子节点继续递归,如果都不是,则说明当前根节点就是最小共同父节点,直接返回即可。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            if(!root) return NULL;
            if(root->val > max(p->val, q->val)) 
                return lowestCommonAncestor(root->left, p, q);
            else if(root->val < min(p->val, q->val)) 
                return lowestCommonAncestor(root->right, p, q);
            else return root;
            
        }
    };
    View Code

    solution2:迭代方法:

    非递归的写法,用个while循环来代替递归调用即可,然后不停的更新当前的根节点,也能实现同样的效果。

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
            if(!root) return NULL;
            while(root)
            {
                if(root->val > max(p->val, q->val)) root = root->left;
                else if(root->val < min(p->val, q->val)) root = root->right;
                else break;
            }
            return root;
        }
    };
    View Code

    参考

    1. leetcode_235_Lowest Common Ancestor of a Binary Search Tree;

  • 相关阅读:
    Tasklet机制
    linux 内核与用户空间通信之netlink使用方法
    inline总结与思考
    PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
    2410下DMA驱动源码分析
    [转]数据库建立索引的一般依据
    [转]性能调优的步骤
    [原] JT SQL Server 性能调优札记之二
    [转]SQL Server 2000执行计划成本(5/5)
    [转]SQL Server 2000执行计划成本(3/5)
  • 原文地址:https://www.cnblogs.com/happyamyhope/p/10394998.html
Copyright © 2011-2022 走看看