牛客刷题日记【二叉搜索树的最近公共祖先|在二叉树中找到两个节点的最近公共祖先】

BM38 在二叉树中找到两个节点的最近公共祖先

给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。

数据范围:树上节点数满足 1≤n≤105 1≤n≤105 , 节点值val满足区间 [0,n)

要求:时间复杂度 O(n)O(n)

注:本题保证二叉树中每个节点的val值均不相同。

思考:

需要判断

  1. 当前节点是否为目标节点,
  2. 左右子树中是否存在目标节点,

当两个节点在上述两种情况下被找到的时候,修改这个节点值。

通过搜索左右子树,完成上述两个判断的过程。

代码:

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param o1 int整型 
     * @param o2 int整型 
     * @return int整型
     */
    
    int d = 0;

    bool pre(TreeNode* root, int o1, int o2) {
        if (root==nullptr) return false;

        bool r1 = root->val == o1;
        bool r2 = root->val == o2;

        bool rr = pre(root->right, o1, o2);
        bool ll = pre(root->left, o1, o2);

        if ((r1 || r2) && (rr || ll)) 
        {
            d = root->val;
            return false;
        }
        if (rr && ll) 
        {
            d = root->val;
            return false;
        }
        if (r1 || r2) return true;
        if (rr || ll) return true;

        return false;
    }

    int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
        // write code here

        pre(root,o1,o2);

        return d;
    }
};

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

描述

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

1.对于该题的最近的公共祖先定义:对于有根树T的两个节点p、q,最近公共祖先LCA(T,p,q)表示一个节点x,满足x是p和q的祖先且x的深度尽可能大。在这里,一个节点也可以是它自己的祖先.

2.二叉搜索树是若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值

3.所有节点的值都是唯一的。

4.p、q 为不同节点且均存在于给定的二叉搜索树中。

数据范围:

3<=节点总数<=10000

0<=节点值<=10000

思考:

这道题目可以用二叉排序树左右子树优化一下的,但是题目也没限复杂度,所以copy上一道题目

代码:

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @param p int整型 
     * @param q int整型 
     * @return int整型
     */
    
    int d = 0;

    bool pre(TreeNode* root, int o1, int o2) {
        if (root==nullptr) return false;

        bool r1 = root->val == o1;
        bool r2 = root->val == o2;

        bool rr = pre(root->right, o1, o2);
        bool ll = pre(root->left, o1, o2);

        if ((r1 || r2) && (rr || ll)) 
        {
            d = root->val;
            return false;
        }
        if (rr && ll) 
        {
            d = root->val;
            return false;
        }
        if (r1 || r2) return true;
        if (rr || ll) return true;

        return false;
    }
    
    int lowestCommonAncestor(TreeNode* root, int p, int q) {
        // write code here
        pre(root,p,q);

        return d;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值